Spark SQL Java - невозможно создать вложенный объект Row - PullRequest
0 голосов
/ 09 сентября 2018

Вот последняя схема, которую я пытаюсь достичь с помощью Spark SQL

|-- references: array (nullable = true)                                                                                                                                                                                                                                        
 |-- element: struct (containsNull = true)                                                                                                                                                                                                                                 
    |-- name: string (nullable = true)                                                                                                                                                                                                                                   
    |-- type: string (nullable = true)                                                                                                                                                                                                                                         
    |-- url: string (nullable = true) 

Я пытаюсь вставить данные в Parquet, но мне не удается создать вложенный объект JSON Row, соответствующий приведенной выше схеме.

Вот следующие вещи, которые я пробовал и не работает -

Tried inserting the data as - Object[] references = new Object[]{"1", "2", "3"}

Tried this Object[] references - new Object[0] (Only this works)

Tried this Object[] references - new Object[]{new Object[]{"1", "2", "3"}}

А потом я возвращаю его как

Row.createFactory(references)

Где я пытаюсь вернуться как объект Row

Мне требуется помощь в создании схемы с использованием Spark SQL Java. Я не могу найти какие-либо решения в Интернете.

1 Ответ

0 голосов
/ 10 сентября 2018

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

    List<Row> data = Lists.newArrayList(
            RowFactory.create(new String[]{"1", "2", "3"}),
            RowFactory.create(new String[]{"4", "5", "6"})
    );

    StructType schema = DataTypes.createStructType(
            new StructField[]{
                    DataTypes.createStructField("name", DataTypes.StringType, true),
                    DataTypes.createStructField("type", DataTypes.StringType, true),
                    DataTypes.createStructField("url", DataTypes.StringType, true),
            });
    Dataset<Row> plain = spark().createDataFrame(data, schema);

    Dataset<Row> result = plain.withColumn("references",
            array(
                    struct(col("name"), col("type"), col("url")))).
            select("references");
    result.show(false);
    result.printSchema();

Вывод:

+----------+
|references|
+----------+
|[[1,2,3]] |
|[[4,5,6]] |
+----------+

root
 |-- references: array (nullable = false)
 |    |-- element: struct (containsNull = false)
 |    |    |-- name: string (nullable = true)
 |    |    |-- type: string (nullable = true)
 |    |    |-- url: string (nullable = true)
...