【问题标题】:Spark 2.2 extracting date not working from unix_timestampSpark 2.2 无法从 unix_timestamp 提取日期
【发布时间】:2019-11-21 19:18:05
【问题描述】:

在 Spark 2.2 中,无法从 unix_timestamp 提取日期 输入数据:

+-------------------------+
|UPDATE_TS                |
+-------------------------+
|26NOV2009:03:27:01.154410|
|24DEC2012:00:47:46.805710|
|02MAY2013:00:45:33.233844|
|21NOV2014:00:33:39.350140|
|10DEC2013:00:30:30.532446|

我尝试了以下方法,但输出 Im getting as null

查询累了:

Spark sql

sqlContext.sql("select from_unixtime(unix_timestamp(UPDATE_TS,'ddMMMyyyy:HH:MM:SS.ssssss'), 'yyyy') as new_date from df_vendor_tab").show()

DSL:

 df_id.withColumn('part_date', from_unixtime(unix_timestamp(df_id.UPDATE_TS, "ddMMMyyyy:HH:MM:SS.sss"), "yyyy"))

预期输出:

2009
2012
2013
2014
2013

【问题讨论】:

  • 您的格式字符串不正确 - 您使用大写字母 M 表示月份和分钟。月份应该是M,而分钟应该是m

标签: pyspark apache-spark-sql apache-spark-2.2


【解决方案1】:

您使用的格式字符串不正确。资本M 是一个月。小写 m 表示分钟。

以下方法可行:

from pyspark.sql.functions import from_unixtime, unix_timestamp, to_date

df_id.withColumn(
    'part_date', 
    from_unixtime(unix_timestamp(df_id.UPDATE_TS, "ddMMMyyyy:HH:mm:SS.SSSSSS"), "yyyy")
).show(truncate=False)
#+-------------------------+---------+
#|UPDATE_TS                |part_date|
#+-------------------------+---------+
#|26NOV2009:03:27:01.154410|2009     |
#|24DEC2012:00:47:46.805710|2012     |
#|02MAY2013:00:45:33.233844|2013     |
#|21NOV2014:00:33:39.350140|2014     |
#|10DEC2013:00:30:30.532446|2013     |
#+-------------------------+---------+

【讨论】:

  • 我更新了 df.withColumn( 'part_date', from_unixtime(unix_timestamp(df['Event Read Time'], "yyyy-MM-dd HH:mm:SS.SSSSSS"), "yyyy" ) ).show(truncate=False),因为我的时间戳采用这种格式 2017-11-11 10:27:26 AM。我的输出值为空。可能是因为“yyyy-MM-dd HH:mm:SS.SSSSSS”不正确。正确的格式是什么?我想得到日期而不仅仅是年份?
  • 这是我的格式 2017-11-11 10:27:26 AM 我的输出应该是 2017-11-11。
  • 谢谢我修好了。正确答案是 df.withColumn( 'part_date', from_unixtime(unix_timestamp(df['Event Read Time'], "yyyy-MM-dd HH:mm:SS"), "yyyy-MM-dd") ).show(截断=假)
【解决方案2】:

简单的 spark-sql 与 unix_timestamp 和 from_unixtime 一起工作正常

sqlContext.sql("Select from_unixtime(unix_timestamp('26NOV2009:03:27:01.154410', 'ddMMMyyyy'), 'yyyy')").show

输出:

+----+
| _c0|
+----+
|2009|
+----+

由于您正在寻找提取年份,因此我没有考虑小时、分钟、秒...

【讨论】:

  • 奇怪的是它与 ddMMMyyyy 一起工作,但不与 ddMMMyyyy:HH:MM:SS.sss 一起工作
猜你喜欢
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 2014-09-04
  • 2021-08-01
  • 1970-01-01
相关资源
最近更新 更多