Как использовать Glue или PySpark, чтобы объединить один кадр как вложенный столбец другого? - PullRequest
0 голосов
/ 04 июля 2019

У меня есть 2 набора плоских данных, которые имеют отношение, которое я хотел бы вложить (т. Е. Преобразовать реляционные таблицы во вложенный JSON)

образец данных

from pyspark.context import SparkContext
from awsglue.context import DynamicFrame

sc = SparkContext.getOrCreate()
glueContext = GlueContext(sc)

# Create some sample data
TableA = spark.createDataFrame(
    schema = ['name', 'a_id'],
    data   = [('Pirate',1),('Monkey',2)]
)

TableB = spark.createDataFrame(
    schema = ['name', 'b_id', 'a_id'],
    data   = [('banana', 1, 1),('ball', 2, 1),('coffee', 3, 2),('plant', 4, 2)]
)

# wrap in Glue DynamicFrame
# note: pretend we started with DynamicFrames, since we're working with Glue ETL Jobs
dfA = DynamicFrame.fromDF(TableA, glueContext, "TableA")
dfA.toDF().show()

dfB = DynamicFrame.fromDF(TableB, glueContext, "TableB")
dfB.toDF().show()

Какие отпечатки:

+------+----+
|  name|a_id|
+------+----+
|Pirate|   1|
|Monkey|   2|
+------+----+

+------+----+----+
|  name|b_id|a_id|
+------+----+----+
|banana|   1|   1|
|  ball|   2|   1|
|coffee|   3|   2|
| plant|   4|   2|
+------+----+----+

Попытка присоединения

Что я пробовал - присоединение согласно документации

joined = Join.apply(dfA, dfB, 'a_id', 'a_id')
joined.toDF().show()

который печатает:

+----+------+----+------+-----+
|b_id|  name|a_id| .name|.a_id|
+----+------+----+------+-----+
|   1|banana|   1|Pirate|    1|
|   2|  ball|   1|Pirate|    1|
|   3|coffee|   2|Monkey|    2|
|   4| plant|   2|Monkey|    2|
+----+------+----+------+-----+

Желаемый вывод

я бы хотел увидеть что-то вроде

+------+----+------------------------+
|name  |a_id|objects                 |
+------+----+------------------------+
|Pirate|   1|[{1, banana},{2,  ball}]|
|Monkey|   2|[{3, coffee},{4, plant}]|
+------+----+------------------------+

Я предполагаю, что это левое соединение с группируемым результатом ... но не могу понять, как

...