У меня есть 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}]|
+------+----+------------------------+
Я предполагаю, что это левое соединение с группируемым результатом ... но не могу понять, как