gpt4 book ai didi

apache-spark - PySpark-列中的to_date格式

转载 作者:行者123 更新时间:2023-12-04 23:36:36 25 4
gpt4 key购买 nike

我目前正在尝试找出如何通过列参数将String-format参数传递给to_date pyspark函数。

具体来说,我有以下设置:

sc = SparkContext.getOrCreate()
df = sc.parallelize([('a','2018-01-01','yyyy-MM-dd'),
('b','2018-02-02','yyyy-MM-dd'),
('c','02-02-2018','dd-MM-yyyy')]).toDF(
["col_name","value","format"])

我目前正在尝试添加一个新列,其中将F.col(“value”)列中的每个日期(它是一个字符串值)解析为一个日期。

对于每种格式,可以分别使用

df = df.withColumn("test1",F.to_date(F.col("value"),"yyyy-MM-dd")).\
withColumn("test2",F.to_date(F.col("value"),"dd-MM-yyyy"))

但是,这给了我2个新列-但我想让1个列包含两个结果-但使用to_date函数似乎无法调用该列:

df = df.withColumn("test3",F.to_date(F.col("value"),F.col("format")))

此处将引发错误“列对象不可调用”。

是否有可能对所有可能的格式采用通用方法(这样我就不必为每种格式手动添加新列)?

最佳答案

您可以使用spark-sql语法在没有udf的情况下use a column value as a parameter:

Spark版本2.2及更高版本

from pyspark.sql.functions import expr
df.withColumn("test3",expr("to_date(value, format)")).show()
#+--------+----------+----------+----------+
#|col_name| value| format| test3|
#+--------+----------+----------+----------+
#| a|2018-01-01|yyyy-MM-dd|2018-01-01|
#| b|2018-02-02|yyyy-MM-dd|2018-02-02|
#| c|02-02-2018|dd-MM-yyyy|2018-02-02|
#+--------+----------+----------+----------+

或等效地使用pyspark-sql:

df.createOrReplaceTempView("df")
spark.sql("select *, to_date(value, format) as test3 from df").show()

Spark版本1.5及更高版本

较早版本的spark不支持 format函数使用 to_date参数,因此您必须使用 unix_timestampfrom_unixtime:

from pyspark.sql.functions import expr
df.withColumn(
"test3",
expr("from_unixtime(unix_timestamp(value,format))").cast("date")
).show()

或等效地使用pyspark-sql:

df.createOrReplaceTempView("df")
spark.sql(
"select *, cast(from_unixtime(unix_timestamp(value,format)) as date) as test3 from df"
).show()

关于apache-spark - PySpark-列中的to_date格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52253192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com