从 Spark DataSet 中的单个列派生多个列并在新列上分组 [重复]

Posted

技术标签:

【中文标题】从 Spark DataSet 中的单个列派生多个列并在新列上分组 [重复]【英文标题】:Derive multiple columns from a single column in Spark DataSet and Group By on the new Columns [duplicate] 【发布时间】:2018-09-20 17:57:27 【问题描述】:

我是 Spark 的初学者,我在数据集中有 Avro 记录,我正在使用这些记录创建 DataSet。

DataDataset<Row> ds = spark.read().format("com.databricks.spark.avro)
.option("avroSchema,schema.toString().load(./*.avro);

我的一个列值看起来像

+--------------------------+
|           col1           |
| VCE_B_WSI_20180914_573   |
| WCE_C_RTI_20181223_324   |
---------------------------+  

我想将此列拆分为多个列,并希望按此新列分组,如下所示

+------------------+
|col1  |col2|col3  |
|   VCE|   B|   WSI|
|   WCE|   C|   RTI|
+------------------+

我非常感谢有关我应该如何执行此操作的任何提示?我是否应该将数据集转换为 RDD 并应用这些转换,但我不确定是否可以在 RDD 中添加新列。

【问题讨论】:

【参考方案1】:

试试下面的

 
        val d = ds.map(r => r.getString(0).split('_'))
             .withColumn("col1", col("value")(0))
             .withColumn("col2", col("value")(1))
             .withColumn("col3", col("value")(2))
             .drop(col("value")).show
 

【讨论】:

【参考方案2】:

您可以通过在数据框上调用 withColumn 函数来完成此操作。您可以在列上使用正则表达式函数来获取它的特定部分。由于您正在寻找 3 个新列,因此您可以调用相同的函数 3 次。 如果您不需要原始列,则可以在末尾调用 drop 函数。

【讨论】:

以上是关于从 Spark DataSet 中的单个列派生多个列并在新列上分组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spark 将多个文件中的列合并到单个文件中

为啥 Spark Dataset.select 替换列值

从 Spark Dataframe 中的数组中提取单个元素

如何从 Spark 2.0 中的 DataFrame 列创建数据集?

如何在 spark sql 2.1.0 中的 Dataset<Row> 上获取 groupby 之后的所有列

如何从 Apache Spark 中的单个文件记录创建多个 RDD 行