Spark Scala: доступ к данным внутри структуры, которая находится внутри массива - PullRequest
1 голос
/ 02 октября 2019

Схема выглядит следующим образом

root
|-- orderitemlist: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- internal-material-code: string (nullable = true)
| | |-- lot-number: string (nullable = true)
| | |-- packaging-item-code: string (nullable = true)
| | |-- packaging-item-code-type: string (nullable = true)

как получить доступ к значениям internal-material-code и lot-number

при создании кадра данных. Я делаю это

df.withColumn("internalmaterialcode", col("orderitemlist")(0).getItem("internal-material-code"))

также

df.withColumn("internalmaterialcode", col("orderitemlist")(0)("internal-material-code"))

также следующим образом

df.withColumn("orderitemlistarray", explode(col("orderitemlist"))) 
.withColumn("internalmaterialcode", col("orderitemlistarray").getItem("internal-material-code")) 

также следующим образом

df.withColumn("orderitemlistarray", explode(col("orderitemlist"))) 
.withColumn("internalmaterialcode", col("orderitemlistarray.internal-material-code")) 

но выдает null

Я видел похожие схемы на вопросы stackoverflow, но ни один из ответов не был полезен для меня. Может ли кто-нибудь ответить на это или направить меня в правильное место.

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

После explode, select только что созданный столбец и все данные из struct fields.

Example:

val va="""{
    "orderitemlist": [{
        "internal-material-code": "123",
        "lot-number": "vv",
        "packaging-item-code": "pp",
        "packaging-item-code-type": "ll"
    },{
        "internal-material-code": "234",
        "lot-number": "vv",
        "packaging-item-code": "pp",
        "packaging-item-code-type": "ll"
    }]
}"""

val df=spark.read.json(Seq(va).toDS).toDF

df.withColumn("arr",explode(col("orderitemlist"))).select("arr.*").show()

Result:

+----------------------+----------+-------------------+------------------------+
|internal-material-code|lot-number|packaging-item-code|packaging-item-code-type|
+----------------------+----------+-------------------+------------------------+
|                   123|        vv|                 pp|                      ll|
|                   234|        vv|                 pp|                      ll|
+----------------------+----------+-------------------+------------------------+

Теперь вы получите все столбцы из структуры внутри массива .. !!

1 голос
/ 02 октября 2019

Я прошел через общий блок кода, и он работает нормально. Пожалуйста, ознакомьтесь с моей работой здесь (в качестве дополнения к более раннему решению):

>>>df.withColumn("ves", $"orderitemlist.lot-number").show
+--------------------+--------+
|       orderitemlist|     ves|
+--------------------+--------+
|[[123, vv, pp, ll...|[vv, vv]|
+--------------------+--------+

>>>df.withColumn("vew", $"orderitemlist".getItem("lot-number")).show
+--------------------+--------+
|       orderitemlist|     vew|
+--------------------+--------+
|[[123, vv, pp, ll...|[vv, vv]|
+--------------------+--------+
...