代码之家  ›  专栏  ›  技术社区  ›  aiman

如何替换数据集<行>中的列名为新名称?

  •  0
  • aiman  · 技术社区  · 6 年前

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

    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(); 
    

    我需要把这个测向仪储存到蜂箱里。
    问题是MongoDB中的一个列名是 Timestamp 这是“蜂巢”中的一个保留字。 因此,MongoDB的JSON数据包含一个键 timestamp .
    我需要替换这个JSON密钥 "timestamp" "timestamp_" .
    如何替换列名 “时间戳” 在里面 Dataset<Row> ds “时间戳” ?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Grisha Weintraub    5 年前

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

    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(...)) .