arrays - 在没有udf的pyspark中重新解析日期
问题描述
我试图通过用 yyyy-mm-dd 替换 dd/mm/yyyy 来解析 pyspark 中的日期列。
import pyspark.sql.functions as F
spark = SparkSession.builders.appName('test').getOrCreate()
sc = spark.sparkContext
sqlc = pyspark.sql.SQLContext(sc)
df = sqlc.createDataFrame([('01/01/2018','user1'),('28/02/2017','user2')], ['Date','user'])
df.show()
+----------+-----+
| Date| user|
+----------+-----+
|01/01/2018|user1|
|28/02/2017|user2|
+----------+-----+
到目前为止我所做的是:
df.select( F.concat_ws('-',F.split(F.col('Date'),'/')).alias('Date_parsed')).show()
+-----------+
|Date_parsed|
+-----------+
| 01-01-2018|
| 28-02-2017|
+-----------+
我想获得的是:
+-----------+
|Date_parsed|
+-----------+
| 2018-01-01|
| 2017-02-28|
+-----------+
知道如何在不使用 udf 的情况下做到这一点吗?
解决方案
您可以在这种情况下使用 sql 函数
>>> import pyspark.sql.functions as F
>>>
>>> df.show()
+----------+-----+
| Date| user|
+----------+-----+
|01/01/2018|user1|
|28/02/2017|user2|
+----------+-----+
>>> df.withColumn('Date',F.date_format(F.to_date('Date','dd/MM/yyyy'),'yyyy-MM-dd')).show()
+----------+-----+
| Date| user|
+----------+-----+
|2018-01-01|user1|
|2017-02-28|user2|
+----------+-----+
更新:请注意,在某些版本的 spark(例如 2.1.1)中,to_date
不将格式作为参数,那么您可以使用F.unix_timestamp
预先格式化日期列:
df.withColumn('Date',F.date_format(F.to_date(
F.unix_timestamp(F.col('Date'),'dd/MM/yyyy').cast('timestamp')
),'yyyy-MM-dd')).show()
推荐阅读
- azure-devops - 将文件从 CI 管道复制到 Azure Devops 存储库
- ecmascript-6 - 使用 module.exports 导出函数内的变量以在另一个文件中引用
- excel - 如何使用 laravel 和 vuejs 下载文件
- javascript - 如何使用javascript解决连续问题?
- powerbi - 如果任何子类别错过 100%,如何将类别归零?
- python - QTreeView 'show-decoration-selected: 0;' 没有效果
- delphi - 从 Firemonkey 中的 URL 加载图像
- javascript - Vue.js - 道具的价值正在改变,但我从不改变它(我不希望它改变)
- yocto - 需要帮助将程序映像(BIN 文件)安装到 imx6s 设备
- android - 是否可以从 IntelliJ IDEA 运行现有的 APK?