Как передать столбец с одной строкой, состоящий из вложенного массива, в Spark Scala?

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