Spark Dataframe объединяет значение ключа json в одной строке - Scala или Python - PullRequest
0 голосов
/ 28 апреля 2020

Я запрашиваю искру sql, как показано ниже, и пытаюсь объединить столбцы в один ряд:

interalexternalid = spark.sql("""Select InternalId, ExternalId from datatable limit 4""")

jsonDf = interalexternalid.select(to_json(struct([interalexternalid[x] for x in interalexternalid.columns])).alias("body"))
display(jsonDf)

Я получаю такие данные:

"body"
{"InternalId":480941,"ExternalId":"a020H00001Tt7NrQAJ"}
{"InternalId":480942,"ExternalId":"a020H00001Tt7NsQAJ"}
{"InternalId":480556,"ExternalId":"a020H00001TdAEVQA3"}
{"InternalId":480557,"ExternalId":"a020H00001TdAEWQA3"}

Моя цель это получить данные, как показано ниже в столбце «тело»

«тело»:

 [{"InternalId": 480941}, {"ExternalId": "a020H00001Tt7NrQAJ"}]
 [{"InternalId": 480942}, {"ExternalId": "a020H00001Tt7NsQAJ"}]
 [{"InternalId": 480556}, {"ExternalId": "a020H00001TdAEVQA3"}]
 [{"InternalId": 480557}, {"ExternalId": "a020H00001TdAEWQA3"}]

как это может быть достигнуто. Я использую python в вышеуказанном контексте. но оба решения python и scala будут полезны. спасибо

1 Ответ

2 голосов
/ 28 апреля 2020

Вместо struct используйте метод array, так как вам нужно body в качестве массива. И используйте create_map, чтобы создать карту от имени столбца до значения:

from pyspark.sql.functions import array, lit, col, to_json, create_map

df.select(to_json(
    array(*[create_map(lit(c), col(c)) for c in df.columns])
).alias("body")).show(truncate=False)

+-------------------------------------------------------------+
|body                                                         |
+-------------------------------------------------------------+
|[{"InternalId":"480941"},{"ExternalId":"a020H00001Tt7NrQAJ"}]|
|[{"InternalId":"480942"},{"ExternalId":"a020H00001Tt7NsQAJ"}]|
|[{"InternalId":"480556"},{"ExternalId":"a020H00001TdAEVQA3"}]|
|[{"InternalId":"480557"},{"ExternalId":"a020H00001TdAEWQA3"}]|
+-------------------------------------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...