#arrays #scala #apache-spark #apache-spark-sql
Вопрос:
Мне нужно работать с этой структурой json;
val sample_data = """{ "Record": { "Id": "id", "IdsArray": [{ "Id1": 1234, "Id2": "master_id", "Id3": "11", "Id4": "12", "Id5": "13" }, { "Id1": 4321, "Id2": "master_id", "Id3": "21", "Id4": "22", "Id5": "23" }], "NameArray": [{ "Number": 1234567890, "Date1": "some date", "Date2": "some another date", "FirstName": "Ron", "MiddleName": "", "LastName": "Swanson", "NameSuffix": "Mr." }] } }"""
Я хочу сгладить этот json и выбрать один из массивов из двух массивов, которые у нас есть в IdsArray. Например, я могу захотеть выбрать на основе значения Id1, т. Е. Какое бы значение ни было больше, выберите этот блок массива из всех доступных элементов массива.
val df = spark.read.json(Seq(sample_data).toDS) df.select($"Record.*") .select($"NameArray", $"IdsArray") .withColumn("someColName", myFuncUDF($"IdsArray") .... ....
Это общий поток логики, который я пробовал.
Для UDF я пробовал вот так;
val myFunc = (col_array: Array[Array[Any]]) =gt; { lt;some conditions and logicgt; } val myFuncUDF = udf(myFunc)
Когда я пытаюсь запустить это, я получаю ошибку;
myFunc: Array[Array[Any]] =gt; Any = lt;function1gt; java.lang.UnsupportedOperationException: Schema for type Any is not supported
Мой вопрос в том, как правильно передать параметр функции. Или, как лучше всего подойти к решению такого рода проблем? Для этой конкретной проблемы .withColumn("someColName", myFuncUDF($"IdsArray")
мне следует указать значение, IdsArray[1]
потому что значение Id1 в IdsArray[1] равно 4321, что больше, чем 1234.