Причина: 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|
+----+