【问题标题】:Convert a string column to timestamp when read into spark读入火花时将字符串列转换为时间戳
【发布时间】:2019-08-29 07:32:17
【问题描述】:

我正在尝试使用 databricks 将 csv 文件读入 spark,但我的时间列是字符串格式,我的时间列条目如下:2019-08-01 23:59:05-07:00 ,我想将其转换为时间戳类型,这是我尝试的:

df = (spark.read      
  .option("header", "true")
  .option("inferSchema", "true")
  .csv(path_to_file)
  .withColumn("observed", unix_timestamp("dt", "yyyy-MM-dd hh:mm:ss.SSSZ")
  .cast("double")
  .cast("timestamp"))
)

但我收到错误消息:cannot resolve '`dt`' given input columns,我猜我没有得到 "yyyy-MM-dd hh:mm:ss.SSSZ" 格式,对吧?

【问题讨论】:

  • 抱怨数据集没有名为dt 的列。使用 printSchema 之类的东西来确认 CSV 文件被正确读取。
  • @HristoIliev 我虽然“observed”是我的列名,而“dt”是新名称。
  • withColumn的第一个参数是新列的名称,第二个参数是列表达式。

标签: apache-spark timestamp databricks


【解决方案1】:

假设您的 csv 看起来像这样:

df = spark.createDataFrame([('2019-08-01 23:59:05-07:00',)], ['dt'])
df.show()

+--------------------+
|                  dt|
+--------------------+
|2019-08-01 23:59:...|
+--------------------+

您可以使用to_timestamp 函数简单地解析时间戳

from pyspark.sql.functions import to_timestamp

df.withColumn('observed', to_timestamp('dt', "yyyy-MM-dd HH:mm:ssXXX")).show()
+--------------------+-------------------+
|                  dt|           observed|
+--------------------+-------------------+
|2019-08-01 23:59:...|2019-08-02 08:59:05|
+--------------------+-------------------+

因此,正如@HristoIliev 所提到的,cannot resolve '`dt`' 背后的原因是“dt”应该是数据框中已经存在的列的名称,而“observed”应该是新列的名称。如果您调整名称认为它仍然不起作用,因为存在格式不匹配:yyyy-MM-dd hh:mm:ss.SSSZ 不会解析 2019-08-01 23:59:05-07:00,但 "yyyy-MM-dd HH:mm:ssXXX" 会。

【讨论】:

    猜你喜欢
    • 2021-07-02
    • 2019-10-30
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2019-03-31
    • 1970-01-01
    相关资源
    最近更新 更多