Как добавить месяц к дате, когда число будет добавлено месяц от имени столбца - PullRequest
0 голосов
/ 04 марта 2020

Я хочу взорвать столбец в искре scala

reference_month          M            M+1          M+2       

2020-01-01               10           12           10        

2020-02-01               10           12           10           

Выходные данные должны быть такими:

reference_month      Month  reference_date_id 
2020-01-01               10     2020-01
2020-01-01               12     2020-02
2020-01-01               10     2020-03
2020-02-01               10     2020-02
2020-02-01               12     2020-03
2020-02-01               10     2020-04

Где reference_date_id = reference_month + x (где x получено из m , m + 1, m + 2).

Есть ли способ получить выходные данные в этом формате в формате spark scala?

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Вы можете отменить поворот техники Apache Spark

import org.apache.spark.sql.functions.expr
data.select($"reference_month",expr("stack(3,`M`,`M+1`,`M+2`) as (Month )")).show()
1 голос
/ 04 марта 2020
You can use **stack** function 
import sys
from pyspark.sql.types import StructType,StructField,IntegerType,StringType
from pyspark.sql.functions import when,concat_ws,lpad,row_number,sum,col,expr,substring,length
from pyspark.sql.window import Window
schema = StructType([
StructField("reference_month", StringType(), True),\
StructField("M", IntegerType(), True),\
StructField("M+1", IntegerType(), True),\
StructField("M+2", IntegerType(), True)
])
mnt = [("2020-01-01",10,12,10),("2020-02-01",10,12,10)]
df=spark.createDataFrame(mnt,schema)
newdf = df.withColumn("t",col("reference_month").cast("date")).drop("reference_month").withColumnRenamed("t","reference_month")
exp = expr("""stack(3,`M`,`M+1`,`M+2`) as (Values)""")
t = newdf.select("reference_month",exp).withColumn('mnth',substring("reference_month",6,2)).withColumn("newmnth",col("mnth").cast("Integer")).drop('mnth')
windowval = (Window.partitionBy('reference_month').orderBy('reference_month').rowsBetween(-sys.maxsize, 0))
ref_cal=t.withColumn("reference_date_id",row_number().over(windowval)-1)
ref_cal.withColumn('new_dt',concat_ws('-',substring("reference_month",1,4),when(length(col("reference_date_id")+col("newmnth"))<2,lpad(col("reference_date_id")+col("newmnth"),2,'0')).otherwise(col("reference_date_id")+col("newmnth")))).drop("newmnth","reference_date_id").withColumnRenamed("new_dt","reference_date_id").orderBy("reference_month").show()

+---------------+------+-----------------+
|reference_month|Values|reference_date_id|
+---------------+------+-----------------+
|     2020-01-01|    10|          2020-01|
|     2020-01-01|    12|          2020-02|
|     2020-01-01|    10|          2020-03|
|     2020-02-01|    10|          2020-02|
|     2020-02-01|    12|          2020-03|
|     2020-02-01|    10|          2020-04|
+---------------+------+-----------------+
0 голосов
/ 04 марта 2020

Мы можем создать array с M, M+1, M+2 и затем взорвать array, чтобы получить требуемый фрейм данных.

Example:

df.selectExpr("reference_month","array(M,`M+1`,`M+2`)as arr").
selectExpr("reference_month","explode(arr) as Month").show()

+---------------+-----+
|reference_month|Month|
+---------------+-----+
|         202001|   10|
|         202001|   12|
|         202001|   10|
|         202002|   10|
|         202002|   12|
|         202002|   10|
+---------------+-----+

//or
val cols= Seq("M","M+1","M+2")

df.withColumn("arr",array(cols.head,cols.tail:_*)).drop(cols:_*).
selectExpr("reference_month","explode(arr) as Month").show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...