我需要使用spark和scala创建多个记录,从单个记录到多个记录。
前任:
姓名| id |月份
标记| 01 | 2020-01-02
澳大利亚航空协会| 12 | 2020-01-02
预期输出:(从原始数据集中的“月”列添加3个月)
姓名| id |月份
标记| 01 | 2020-01-02
标记| 01 | 2020-02-02
标记| 01 | 2020-03-02
澳大利亚航空协会| 12 | 2020-01-02
澳大利亚航空协会| 12 | 2020-02-02
澳大利亚航空协会| 12 | 2020-03-02
感谢你在这方面的帮助。谢谢您。
3条答案
按热度按时间zpjtge221#
我认为,最简单的方法是生成要添加的月份,然后按如下方式添加月份-
pkln4tw62#
从
Spark-2.4
使用sequence
内置函数。例子:
In Scala:
```df.show()
//+----+---+----------+
//|Name| Id| Month|
//+----+---+----------+
//|Mark| 01|2020-01-02|
//|Aana| 12|2020-01-02|
//+----+---+----------+
val df1=sql("SELECT explode(sequence(to_date('2018-01-02'), to_date('2018-03-02'), interval 1 month)) as Month")
df.select("Name","Id").crossJoin(df1).show()
//+----+---+----------+
//|Name| Id| Month|
//+----+---+----------+
//|Mark| 01|2018-01-02|
//|Mark| 01|2018-02-02|
//|Mark| 01|2018-03-02|
//|Aana| 12|2018-01-02|
//|Aana| 12|2018-02-02|
//|Aana| 12|2018-03-02|
//+----+---+----------+
`In Pyspark:`
df.show()
+----+---+----------+
|Name| Id| Month|
+----+---+----------+
|Mark| 01|2020-01-02|
|Aana| 12|2020-01-02|
+----+---+----------+
df1= sql("SELECT explode(sequence(to_date('2018-01-02'), to_date('2018-03-02'), interval 1 month)) as Month")
df.select("Name","Id").crossJoin(df1).show()
+----+---+----------+
|Name| Id| Month|
+----+---+----------+
|Mark| 01|2018-01-02|
|Mark| 01|2018-02-02|
|Mark| 01|2018-03-02|
|Aana| 12|2018-01-02|
|Aana| 12|2018-02-02|
|Aana| 12|2018-03-02|
+----+---+----------+
bpzcxfmw3#
检查以下代码。