Из-за того, что паркет не может парсировать пустые массивы, я заменил пустые массивы на ноль, прежде чем писать таблицу. Теперь, когда я читаю таблицу, я хочу сделать наоборот:
У меня есть DataFrame со следующей схемой:
|-- id: long (nullable = false)
|-- arr: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- x: double (nullable = true)
| | |-- y: double (nullable = true)
и следующий контент:
+---+-----------+
| id| arr|
+---+-----------+
| 1|[[1.0,2.0]]|
| 2| null|
+---+-----------+
Я бы хотел заменить пустой массив (id = 2) пустым массивом, т.е.
+---+-----------+
| id| arr|
+---+-----------+
| 1|[[1.0,2.0]]|
| 2| []|
+---+-----------+
Я пробовал:
val arrSchema = df.schema(1).dataType
df
.withColumn("arr",when($"arr".isNull,array().cast(arrSchema)).otherwise($"arr"))
.show()
, что дает:
java.lang.ClassCastException: org.apache.spark.sql.types.NullType $
не может быть приведен к org.apache.spark.sql.types.StructType
Edit: я не хочу "жестко кодировать" любую схему моего столбца массива (по крайней мере, не схему структуры), потому что это может варьироваться от случая к случаю. Я могу использовать только информацию схемы из df
во время выполнения
Кстати, я использую Spark 2.1, поэтому не могу использовать typedLit