У меня есть current.printSchema, как показано ниже, и пример данных JSON показан там, где столбцы (ada, adw) имеют тип array (struct).
root
|-- VIN: string (nullable = true)
|-- TT: long (nullable = true)
|-- MSG_TYPE: string (nullable = true)
|-- ABS: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- E: long (nullable = true)
| | |-- V: double (nullable = true)
|-- ADA: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- E: long (nullable = true)
| | |-- V: double (nullable = true)
|-- ADW: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- E: long (nullable = true)
| | |-- V: double (nullable = true)
current_data:
+---------------- +---+---------+-----------------------------------------------------+---------------------------+
|vin |tt |msg_type |ada |adw |
+-----------------+---+---------+-----------------------------------------------------+--------------------------+
|FU7XXXXXXXXXXXXXX|0 |SIGNAL |[{"E":15XXXXXXXX,"V":2, {"E":15XXXXXXXX,"V":1}] |null |
|FU7XXXXXXXXXXXXXX|0 |SIGNAL |null |[{"E":15XXXXXXXX,"V":3}] |
|FU7XXXXXXXXXXXXXX|0 |SIGNAL |null |[{"E":15XXXXXXXX,"V":4.1}]|
+-----------------+---+---------+--------------------------+--------------------------+--------------------------+
Мне понадобится final_output_data, как показано ниже, где столбцы массива (struct) (ada, adw) должны быть добавлены в структуре в качестве дополнительного элемента, и должен быть внешний столбец с именем event.
final_output_data to be:
, чтобы я мог использовать функцию разнесения, как показано ниже, для получения требуемого результата:
SELECT vin, tt, msg_type, events.SN as SN, events.E as ST,events.V as SV FROM table_name LATERAL VIEW explode(event) exploded_table as events;
IВ Spark 2.4 мы могли бы использовать функцию arrays_zip, как показано ниже, но есть ли способ добиться этого, используя Spark 2.3, либо через UDF, любая помощь будет высоко оценена.
val mod_df = df.withColumn("SIGNAL_TEST",
arrays_zip(
array(lit("ABS")).as("SN"),
col("ABS.E").as("E"),
col("ABS.V").alias("V")
))
.withColumn("SIGNAL",
$"SIGNAL_TEST".cast(ArrayType(elem_struct_recomposed)))