【问题标题】:Add new column from ArrayList of Integer to CSV with Spark - Java使用 Spark 将新列从 Integer 的 ArrayList 添加到 CSV - Java
【发布时间】:2020-12-02 11:53:40
【问题描述】:

我想将从整数数组中获取的新值列添加到 Spark 读取的 CSV。

SQLContext context = new SQLContext(spark);
StructType customSchema = new StructType(new StructField[] {
                    new StructField("sex", DataTypes.StringType, true, Metadata.empty())
                });
int[] values= {31, 28, 31};
DataFrameReader read = context.read().format("com.databricks.spark.csv").
                    schema(customSchema).
                    option("header", true).
                    option("delimiter", ",");
Dataset<Row> csvDataset = read.load(path).withColumn("age", ...);

也许可以用withColumn()函数来完成,但我不知道如何设置值。

有什么办法吗?

+---+---+
|sex|age|
+---+---+
|M  |31 |
|F  |28 |
|F  |31 |
+---+---+

【问题讨论】:

    标签: java csv apache-spark


    【解决方案1】:

    使用typedLit 函数。

    检查下面的代码。

    dfa
    .withColumn("age",explode(typedLit(values)))
    .show(false)
    

    【讨论】:

    • 我无法将值应用于 typedLit 函数
    • 有什么具体原因吗?
    • 类型函数中的typedLit(T, TypeTags.TypeTag)方法不适用于参数(int[])
    • 您的值是 int 类型的数组,对吗??.. typedLit 将采用任何 int 值数组。
    • 我认为你需要从java类型转换为scala类型,然后将其传递给这个函数
    【解决方案2】:

    我认为您无法使用 Spark 实现您的要求。请记住,Spark 将数据视为分布式数据,这意味着两个数据集中的行顺序是任意的,因此您无法根据行的顺序来匹配行。

    我的建议是:

    • 在两者中都提供某种 id 列,然后简单地加入它们。
    • 或者您可以通过简单的读写 I/O 操作来实现这一点

    【讨论】:

      猜你喜欢
      • 2015-01-07
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      相关资源
      最近更新 更多