Спецификация байт-кода Java [закрывается]

Вот родной подход Spark, который не затрудняет имена столбцов. Он основан на aggregateByKey и использует словарь для сбора столбцов, которые отображаются для каждого ключа. Затем мы собираем все имена столбцов, чтобы создать окончательный файл данных. [Предварительная версия использовала jsonRDD после испускания словаря для каждой записи, но это более эффективно.] Ограничение на конкретный список столбцов или исключение таких, как XX, было бы легкой модификацией.

Производительность кажется хорошим даже на довольно больших столах. Я использую вариацию, которая подсчитывает количество раз, каждое из которых имеет переменное число событий для каждого идентификатора, генерируя один столбец для каждого типа события. Код в основном тот же, за исключением того, что для подсчета вхождений используется коллекция.Counter вместо dict в seqFn.

from pyspark.sql.types import *

rdd = sc.parallelize([('X01',41,'US',3),
                       ('X01',41,'UK',1),
                       ('X01',41,'CA',2),
                       ('X02',72,'US',4),
                       ('X02',72,'UK',6),
                       ('X02',72,'CA',7),
                       ('X02',72,'XX',8)])

schema = StructType([StructField('ID', StringType(), True),
                     StructField('Age', IntegerType(), True),
                     StructField('Country', StringType(), True),
                     StructField('Score', IntegerType(), True)])

df = sqlCtx.createDataFrame(rdd, schema)

def seqPivot(u, v):
    if not u:
        u = {}
    u[v.Country] = v.Score
    return u

def cmbPivot(u1, u2):
    u1.update(u2)
    return u1

pivot = (
    df
    .rdd
    .keyBy(lambda row: row.ID)
    .aggregateByKey(None, seqPivot, cmbPivot)
)
columns = (
    pivot
    .values()
    .map(lambda u: set(u.keys()))
    .reduce(lambda s,t: s.union(t))
)
result = sqlCtx.createDataFrame(
    pivot
    .map(lambda (k, u): [k] + [u.get(c) for c in columns]),
    schema=StructType(
        [StructField('ID', StringType())] + 
        [StructField(c, IntegerType()) for c in columns]
    )
)
result.show()

Производит:

ID  CA UK US XX  
X02 7  6  4  8   
X01 2  1  3  null
33
задан 11 December 2008 в 00:39
поделиться

8 ответов

Хорошая ссылка для спецификации байт-кода Java , Спецификация .

виртуальной машины Java Видит Глава 4. Класс Формат файла и Глава 6. Система команд виртуальной машины Java .

23
ответ дан 27 November 2019 в 18:24
поделиться

Немного больше "графического" объяснения, работы разработчика IBM: байт-код Понимания делает Вас лучшим программистом .

11
ответ дан 27 November 2019 в 18:24
поделиться

Также полезный дизассемблер javap и платформы управления байт-кодом как ASM и BCEL, даже если все, что Вы хотите сделать, проверяют Ваши классы.

4
ответ дан 27 November 2019 в 18:24
поделиться

Книжное Программирование для виртуальной машины Java объясняет систему команд JVM и как написать код для него. Это также представляет ассемблер байт-кода, названный улуном, который я не смог загрузить. Можно, однако, использовать Jasmin, предшественник улуна. По существу Вы пишете текстовый файл с инструкциями, и Jasmin выложит .class файл. Книга была опубликована в 1999, но это - все еще хорошее и нежное введение в VM.

4
ответ дан 27 November 2019 в 18:24
поделиться

Прежде всего, я предлагаю генерировать код Java с Вашего языка.

Это сделает чтение и отладку намного более простыми.

2
ответ дан 27 November 2019 в 18:24
поделиться

Спецификация виртуальной машины Java является хорошим местом для запуска.

См. Главу 4 класс Формат файла . Обновления покрывают новые атрибуты, добавленные, так как 2-й выпуск был сделан.

3
ответ дан 27 November 2019 в 18:24
поделиться

Это немного более специализировано, но здесь является онлайн-презентацией о том, как оптимизировать сгенерированный байт-код для работы JVM. Это было представлено в недавних Саммитах Языков JVM. InfoQ имеет набор презентаций от той конференции, которая могла бы помочь кому-то желающему поднять язык на JVM (или видеть, что было уже сделано).

1
ответ дан 27 November 2019 в 18:24
поделиться

Возможно, посмотрите пример Преона о том, как анализировать файл класса Java . Он имеет довольно полное представление байт-кода в объектной модели Java.

2
ответ дан 27 November 2019 в 18:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: