Я ищу способ преобразовать массив строки JSON в массив структуры.

Пример данных:

{
  "col1": "col1Value",
  "col2":[
    "{\"SubCol1\":\"ABCD\",\"SubCol2\":\"EFGH\"}",
    "{\"SubCol1\":\"IJKL\",\"SubCol2\":\"MNOP\"}"
  ]
}

Схема набора данных:

StructType(StructField(col1,StringType,true), StructField(col2,ArrayType(StringType,true),true))

Ожидаемый результат:

{
  "col1": "col1Value",
  "col2":[
    {"SubCol1":"ABCD","SubCol2":"EFGH"},
    {"SubCol1":"IJKL","SubCol2":"MNOP"}
  ]
}

Ожидаемая схема:

StructType(StructField(col1,StringType,true), StructField(col2,ArrayType(StructType(StructField(SubCol1,StringType,true), StructField(SubCol2,StringType,true)),true),true))

Я пробовал df.withColumn("col2", from_json($"col2", new_schema)), но это дало мне ошибку:

org.apache.spark.sql.AnalysisException: невозможно разрешить 'jsontostructs (`col2`)' из-за несоответствия типа данных: для аргумента 1 требуется строковый тип, однако '' col2 '' имеет тип массива.

-2
user2167322 20 Май 2021 в 18:32

1 ответ

Лучший ответ

Вы можете сначала преобразовать col2 в строковый тип:

val df2 = df.withColumn("col2", 
    from_json(
        $"col2".cast("string"), 
        lit("array<struct<SubCol1:string, SubCol2:string>>")
        // or use new_schema as in your code
    )
)
1
mck 20 Май 2021 в 15:37