org. apache .spark. sql .AnalysisException: не удается разрешить: при чтении данных из вложенного json - PullRequest
0 голосов
/ 10 июля 2020

может ли кто-нибудь подсказать мне, как мне получить доступ к amt1, amt2, total из этой схемы json. после загрузки файла json, когда я пытаюсь выбрать данные, используя

     df.select($"b2b.bill.amt1").

, я получаю сообщение об ошибке ниже.

     org.apache.spark.sql.AnalysisException: cannot resolve '`b2b`.`bill`['amt1']' due to data type 
     mismatch: argument 2 requires integral type, however, ''amt1'' is of string type.;;

    Json Schema:

    |-- b2b: array (nullable = true)
    |    |-- element: struct (containsNull = true)
    |    |    |-- transid: string (nullable = true)
    |    |    |-- bill: array (nullable = true)
    |    |    |    |-- element: struct (containsNull = true)
    |    |    |    |    |-- amt1: double (nullable = true)
    |    |    |    |    |-- amt2: string (nullable = true)
    |    |    |    |    |-- total: string (nullable = true)

1 Ответ

0 голосов
/ 10 июля 2020

Причина: amt1 - это свойство объекта, которое находится внутри двух типов массивов, т.е. b2b и bill. вам нужно дважды взорваться, чтобы получить доступ к полю amt1.

Проверьте код ниже.

scala> adf.printSchema
root
 |-- b2b: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- bill: array (nullable = true)
 |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |-- amt1: double (nullable = true)
 |    |    |    |    |-- amt2: string (nullable = true)
 |    |    |    |    |-- total: string (nullable = true)
 |    |    |-- transid: string (nullable = true)


scala> adf.select(explode($"b2b.bill").as("bill")).withColumn("bill",explode($"bill")).select("bill.*").show(false)
+----+----+-----+
|amt1|amt2|total|
+----+----+-----+
|10.0|20  |ttl  |
+----+----+-----+

Другой способ ... но он дает только первое значение из массива.

scala> adf.select(explode($"b2b.bill"(0)("amt1")).as("amt1")).show(false)
+----+
|amt1|
+----+
|10.0|
+----+
scala> adf.selectExpr("explode(b2b.bill[0].amt1) as amt1").show(false)
+----+
|amt1|
+----+
|10.0|
+----+
...