Spark Dataset - 如何通过修改现有列值来创建新列

Posted

技术标签:

【中文标题】Spark Dataset - 如何通过修改现有列值来创建新列【英文标题】:Spark Dataset - How to create a new column by modifying an existing column value 【发布时间】:2018-10-31 12:17:02 【问题描述】:

我有一个如下所示的数据集

Dataset<Row> dataset = ...
dataset.show()

| NAME | DOB      |
+------+----------+
| John | 19801012 |
| Mark | 19760502 |
| Mick | 19911208 |

我想把它转换成下面的(格式化的DOB)

| NAME | DOB        |
+------+------------+
| John | 1980-10-12 |
| Mark | 1976-05-02 |
| Mick | 1991-12-08 |

我该怎么做?基本上,我试图弄清楚如何以通用方式操作现有的列字符串值。

我尝试使用dataset.withColumn,但不知道如何实现。

感谢任何帮助。

【问题讨论】:

那些投反对票的人,你能解释一下为什么,以便我以后避免 【参考方案1】:

使用“substring”和“concat”函数:

df.withColumn("DOB_FORMATED",
  concat(substring($"DOB", 0, 4), lit("-"), substring($"DOB", 5, 2), lit("-"), substring($"DOB", 7, 2)))

【讨论】:

在java中:dataset.withColumn("DOB", concat(substring(col("DOB"), 0, 4), lit("-"), substring(col("DOB") , 5, 2), lit("-"), substring(col("DOB"), 7, 2)))【参考方案2】:

将数据加载到数据框(deltaData)中,然后使用以下行

deltaData.withColumn("DOB", date_format(to_date($"DOB", "yyyyMMdd"), "yyyy-MM-dd")).show()

【讨论】:

【参考方案3】:

假设 DOB 是一个字符串,你可以写一个 UDF

def formatDate(s: String): String 
  // date formatting code


val formatDateUdf = udf(formatDate(_: String))

ds.select($"NAME", formatDateUdf($"DOB").as("DOB"))

【讨论】:

以上是关于Spark Dataset - 如何通过修改现有列值来创建新列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java 在 Dataset Spark 中过滤列并删除行

如何使用 Spark Dataset API (Java) 创建数组列

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

Spark RDD转换成DataFrame的两种方式

为啥 Spark Dataset.select 替换列值

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