Привет, я пытаюсь отфильтровать фрейм данных на основе условия, а затем применить схему, если она соответствует, иначе оставьте ее как есть.
val schema = ArrayType(StructType(StructField("packQty",FloatType,true):: StructField("gtin",StringType,true) :: Nil))
+--------------+---------+-----------+-----+--------------------------------------+
|orderupcnumber|enrichqty|allocoutqty|allocatedqty|gtins
|
+--------------+---------+-----------+--------------------------------------------+
|5203754 |15.0 |1.0 |5.0 |[{"packQty":120.0,"gtin":"00052000042276"}]|
|5203754 |15.0 |1.0 |2.0 |[{"packQty":120.0,"gtin":"00052000042276"}|
|5243700 |25.0 |1.0 |2.0 |na
|
+--------------+---------+-----------+------------+-------------------------------+
Я пытаюсь добавить столбец на основе схемы, если Столбец gtins не является «na», если я добавляю 0, но он выдает ошибку, говоря:
df.withColumn("jsonData",when($"gtins"=!="na",from_json($"gtins",schema)).otherwise(0))
Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve 'CASE
WHEN contains(`gtins`, 'na') THEN 0 ELSE jsontostructs(`gtins`) END' due to data type
mismatch: THEN and ELSE expressions should all be same type or coercible to a common type;;
df.select($"orderupcnumber",$"enrichqty",$"allocoutqty",$"allocatedqty",explode($"jsonData").as("jsonData"))
+--------------+---------+-----------+-----+--------------+
|orderupcnumber|enrichqty|allocoutqty|allocatedqty|gtins|JsonData
+--------------+---------+-----------+--------------------+
|5203754 |15.0|1.0|5.0|[{"packQty":120.0,"gtin":"00052000042276”}]|[120.0, 00052000042276]
|5203754 |15.0|1.0 |2.0|[{"packQty":120.0,"gtin":"00052000042276”}|[120.0,00052000042276]
|5243700 |25.0 |1.0|2.0 |na |null
+--------------+---------+-----------+------------+----+
df.select($"orderupcnumber",$"enrichqty",$"allocoutqty",$"allocatedqty",$"jsonData.packQty".as("packQty"),$"jsonData.gtin".as("gtin")
этот выбор выбирает только данные, где jsonData не равно null
+---------+-----------+------------+-------+--------------+
orderupcnumber |enrichqty|allocoutqty|allocatedqty|packQty|gtin |
+-----------+------------+----------------+------------+
5203754|15.0 |1.0 |5.0 |120.0 |00052000042276|
5203754|15.0 |1.0 |5.0 |144.0 |00052000042283|
5243700|25.0 |1.0 |5.0 | | |
+-----------+------------+----------------+------------+----------
как я могу включить один и с нулевым значением.