Spark-Java:如何将Dataset <row>中的列名替换为新名称?

时间:2018-09-18 15:07:22

标签: java apache-spark apache-spark-sql

我正在使用MongoDB作为JSON从Spark读取数据:

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Encoders;
import org.apache.spark.sql.Row;
....
..    
Dataset<Row> ds = MongoSpark.load(jsc).toDF(); 

我需要将此DF存储到Hive。
问题在于MongoDB中的列名之一是Timestamp,这是Hive中的保留字。 因此,来自MongoDB的JSON数据包含一个密钥timestamp
我需要将此json键"timestamp"替换为"timestamp_"
如何将"timestamp"中的列名Dataset<Row> ds替换为"timestamp_"

1 个答案:

答案 0 :(得分:1)

如果要重命名嵌套的列,可以执行以下操作:

  1. 拉平/展开所有结构列
  2. 重命名列
  3. 收起所有列

假设您的数据集架构如下:

root  
      |-- col1
      |-- col2
      |-- struct1
      |    |-- timestamp
      |    |-- a  
      |    |-- b

因此您可以执行以下操作

ds = ds
        .select(col("*"), col("struct1.*"))
        .withColumnRenamed("timestamp", "timestamp_")
        .select(
                 col("col1"),
                 col("col2"),
                 struct("timestamp_", "a", "b").as("struct1")
        );

如果要重命名数组中的嵌套列,则首先应使用explode函数来扩展数组。

ds = ds.select(col("a"), col("b"), explode(col("struct1")))

然后,您可以如上所述重命名嵌套的列。重命名后,如果要将结构折叠回数组下,请使用groupBy(...).agg(collect_list(...))