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

时间:2018-10-31 12:17:03

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

我有一个类似下面的数据集

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,但不知道如何实现。

感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

具有“子字符串”和“ concat”功能:

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

答案 1 :(得分:0)

将数据加载到dataframe(deltaData)中,只需使用以下行

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

答案 2 :(得分:-1)

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

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

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

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