Извлеките значения подключей всех ключей в кадре данных json spark - PullRequest
0 голосов
/ 30 июня 2019

У меня есть фрейм данных со схемой, как показано ниже: (У меня есть большое количество ключей)

 |-- loginRequest: struct (nullable = true)
 |    |-- responseHeader: struct (nullable = true)
 |    |    |-- status: long (nullable = true)
 |    |    |-- code: long (nullable = true)
 |-- loginResponse: struct (nullable = true)
 |    |-- responseHeader: struct (nullable = true)
 |    |    |-- status: long (nullable = true)
 |    |    |-- code: long (nullable = true)

 
 
 

Я хочу создать столбец со статусом всех ключей responseHeader.status

Ожидается

+--------------------+--------------------+------------+
|        loginRequest|       loginResponse|  status    |
+--------------------+--------------------+------------+
|[0,1]               |                null|      0     |
|                null|[0,1]               |      0     |
|                null|               [0,1]|      0     |
|                null|               [1,0]|      1     |
+--------------------+--------------------+-------------

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

Вы можете получить подполя с разделителем . в операторе select и с помощью метода coalesce вы должны получить именно то, к чему стремитесь, т.е. давайте назовем входной фрейм данных df суказанная вами схема ввода, тогда этот фрагмент кода должен выполнить работу:

import org.apache.spark.sql.functions.{coalesce, col}

val df_status = df.withColumn("status", 
                              coalesce(
                               col("loginRequest.responseHeader.status"),
                               col("loginResponse.responseHeader.status")
                               )
                              )

Что делает coalesce, так это то, что он принимает первое ненулевое значение в порядке столбцов ввода для метода иесли нет ненулевого значения, возвращается ноль (см. https://spark.apache.org/docs/2.3.0/api/java/org/apache/spark/sql/functions.html#coalesce-org.apache.spark.sql.Column...-).

0 голосов
/ 30 июня 2019

Простой выбор решит вашу проблему.

У вас есть поле гнезда:

loginResponse: struct (nullable = true)
 |    |-- responseHeader: struct (nullable = true)
 |    |    |-- status

Быстрый способ - сгладить ваш фрейм данных.

Делать что-токак это:

df.select(df.col("loginRequest.*"),df.col("loginResponse.*"))

И заставить его работать оттуда:

Или,

Вы можете использовать что-то вроде этого:

var explodeDF = df.withColumn("statusRequest", df("loginRequest. responseHeader"))

, которыйВы помогли мне ответить на эти вопросы:

Для того, чтобы он заполнялся либо по ответу, либо по запросу, вы можете использовать и условие when в искре.- Как использовать условие И или ИЛИ в режиме Spark

...