Вот родной подход 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
Хорошая ссылка для спецификации байт-кода Java , Спецификация .
виртуальной машины Java Видит Глава 4. Класс Формат файла и Глава 6. Система команд виртуальной машины Java .
Немного больше "графического" объяснения, работы разработчика IBM: байт-код Понимания делает Вас лучшим программистом .
Также полезный дизассемблер javap и платформы управления байт-кодом как ASM и BCEL, даже если все, что Вы хотите сделать, проверяют Ваши классы.
Книжное Программирование для виртуальной машины Java объясняет систему команд JVM и как написать код для него. Это также представляет ассемблер байт-кода, названный улуном, который я не смог загрузить. Можно, однако, использовать Jasmin, предшественник улуна. По существу Вы пишете текстовый файл с инструкциями, и Jasmin выложит .class файл. Книга была опубликована в 1999, но это - все еще хорошее и нежное введение в VM.
Прежде всего, я предлагаю генерировать код Java с Вашего языка.
Это сделает чтение и отладку намного более простыми.
Спецификация виртуальной машины Java является хорошим местом для запуска.
См. Главу 4 класс Формат файла . Обновления покрывают новые атрибуты, добавленные, так как 2-й выпуск был сделан.
Это немного более специализировано, но здесь является онлайн-презентацией о том, как оптимизировать сгенерированный байт-код для работы JVM. Это было представлено в недавних Саммитах Языков JVM. InfoQ имеет набор презентаций от той конференции, которая могла бы помочь кому-то желающему поднять язык на JVM (или видеть, что было уже сделано).
Возможно, посмотрите пример Преона о том, как анализировать файл класса Java . Он имеет довольно полное представление байт-кода в объектной модели Java.