Как объединить вложенные столбцы в spark с использованием столбцов - PullRequest
0 голосов
/ 25 августа 2018

У меня есть 2 кадра данных, к которым я хотел бы присоединиться.

DF1:

root
 |-- myStruct: struct (nullable = true)
 |    |-- id: string (nullable = true)
 |    |-- region: long (nullable = true)
 |-- first_name: string (nullable = true)

DF2:

root
 |-- id: string (nullable = true)
 |-- region: long (nullable = true)
 |-- second_name: string (nullable = true)

Мой оператор соединения:

df1.join(df2, Seq("id", "region"), "leftouter")

, но он не работает с

USING column `id` cannot be resolved on the left side of the join. The left-side columns: myStruct, first_name

Я использую Spark 2.2 на Scala

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Вы можете использовать запись . для выбора элемента из столбца struct. поэтому, чтобы выбрать id из df1 , вам нужно будет сделать myStruct.id, а чтобы выбрать region, вы должны использовать myStruct.region.

И , поскольку имена столбцов, которые будут использоваться, не совпадают вы можете использовать === для сравнения как

df1.join(df2, df1("myStruct.id") === df2("id") && df1("myStruct.region") === df2("region"), "leftouter")

Вы должны иметь объединенный фрейм данных со следующей схемой

root
 |-- myStruct: struct (nullable = true)
 |    |-- id: string (nullable = true)
 |    |-- region: long (nullable = false)
 |-- first_name: string (nullable = true)
 |-- id: string (nullable = true)
 |-- region: integer (nullable = true)
 |-- second_name: string (nullable = true)

Вы можете удалить ненужные столбцы после объединения или выбрать только необходимые столбцы после объединения

Надеюсь, ответ полезен

0 голосов
/ 25 августа 2018

Это потому, что в DF1 id является элементом столбца myStruct, который имеет тип struct. Чтобы присоединиться, вы можете сделать что-то вроде

val df = df1
.withColumn("id", col("myStruct.id"))
.withColumn("region", col("myStruct.region"))

df.join(df2, Seq("id", "region"), "leftouter")

Это по существу извлекает id и region из столбца struct.

...