Spark SQL将数组扩展为多列

时间:2017-01-12 05:55:20

标签: apache-spark apache-spark-sql

我正在为来自S3中的oracle源的每行更新存储json消息。 json结构如下

{
    "tableName": "ORDER",
    "action": "UPDATE",
    "timeStamp": "2016-09-04 20:05:08.000000",
    "uniqueIdentifier": "31200477027942016-09-05 20:05:08.000000",
    "columnList": [{
        "columnName": "ORDER_NO",
        "newValue": "31033045",
        "oldValue": ""
    }, {
        "columnName": "ORDER_TYPE",
        "newValue": "N/B",
        "oldValue": ""
    }]
}

我使用spark sql根据唯一标识符的最大值查找每个键的最新记录。 columnList是一个包含表列的列表的数组.i想要连接多个表并获取最新的记录。 如何将一个表的json数组中的列与另一个表中的列连接起来。有没有办法将json数组分解为多个列。例如,上面的json将ORDER_NO作为一列,ORDER_TYPE作为另一列。如何基于columnName字段创建具有多个列的数据框 例如:new RDD应该有列(tableName,action,timeStamp,uniqueIdentifier,ORDER_NO,ORDER_NO) 应该从json中的newValue字段映射ORDER_NO和ORDER_NO字段的值。

1 个答案:

答案 0 :(得分:0)

通过使用RDD apis

以编程方式创建架构,找到了解决方案
  Dataset<Row> dataFrame = spark.read().json(inputPath);
    dataFrame.printSchema();
    JavaRDD<Row> rdd = dataFrame.toJavaRDD();
    SchemaBuilder schemaBuilder = new SchemaBuilder();
    // get the schema column names in appended format
    String columnNames = schemaBuilder.populateColumnSchema(rdd.first(), dataFrame.columns());

SchemaBuilder是一个创建的自定义类,它接受rdd详细信息并返回分隔符分隔的列名。 然后使用RowFactory.create调用,将json值映射到模式。 文档参考http://spark.apache.org/docs/latest/sql-programming-guide.html#programmatically-specifying-the-schema