Добавить имя столбца в качестве нового элемента в массив структур, используя Spark 2.3 - PullRequest
0 голосов
/ 10 октября 2019

У меня есть 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:

enter image description here

, чтобы я мог использовать функцию разнесения, как показано ниже, для получения требуемого результата:

 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)))
...