【问题标题】:Load Date Column from raw data with '/' separator in sparkSQL在 sparkSQL 中使用“/”分隔符从原始数据加载日期列
【发布时间】:2023-03-07 16:24:01
【问题描述】:

我在 sparkSQL 中有数据类型为 DATE 的列 例如
CREATE TABLE ABC(startDate DATE, EndDate DATE....
我将数据加载为
LOAD DATA INPATH './input/user.txt' INTO TABLE ABC

user.txt 中的数据是这样的

2016/06/12 2016/06/15 
2016/06/12 2016/06/15

但它会将数据加载为

null null
null null

如果是的话

2016-06-12 2016-06-15 
2016-06-12 2016-06-15

然后它会正确获取数据。
日期分隔符为'/'时如何处理数据?
我不想替换输入文件中的分隔符。
请帮我。谢谢。

【问题讨论】:

  • 我认为您应该在加载脚本中使用日期转换函数(将字符串转换为日期)。
  • 您打算在开始和结束数据字段上使用任何日期时间函数吗?
  • @vkp 我尝试使用 CAST(startDate as DATE) 将数据插入到其他表中,但仍然输入空值。
  • @dheee 是的,我打算稍后使用时间函数,例如 (endDate - startDate) 等。

标签: sql apache-spark hive apache-spark-sql hiveql


【解决方案1】:

我之前在 Hive 中遇到过这个问题。我找到了解决方法。首先将它们加载为字符串而不是数据类型 DATE

例如:

CREATE TABLE ABC(startDate string, EndDate string....)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ']'
STORED AS TEXTFILE
LOCATION './input/user.txt';

然后我使用字符串函数从上述字段中提取日期/月份/年份。例如

select substr(date,1,4) as year,substr(date,6,1) as month .... from ABC

另一种方法是将“/”替换为“-”,然后将它们转换为 DATE 类型并使用 Date 函数

例子

select regexp_replace(startDate,'/','-') from ABC

以上都是如何在 Hive 中实现的。在 spark 中处理这个问题也是首先将它们作为字符串加载到数据帧中。

val s1 = Seq(("2016/06/12", "2016/06/15" ), ("2016/06/12", "2016/06/15")).toDF("x", "y")
val result = s1.select(regexp_replace($"x","/", "-"),regexp_replace($"y","/", "-")).show()

result 
+----------+----------+
| startDate|   EndDate|
+----------+----------+
|2016-06-12|2016-06-15|
|2016-06-12|2016-06-15|
+----------+----------+

希望这会有所帮助。

【讨论】:

  • 在处理数据时更换分隔符效果很好。谢谢@dheee
【解决方案2】:

我知道回答这个问题有点晚了,但是在 SPARK 中,您还可以在创建表格时在选项中包含 dateFormat。 这会将您的日期格式从 2016/06/12 转换为 2016-06-12

CREATE TABLE IF NOT EXISTS ABC (
                startDate DATE,
                EndDate DATE,
                ...
        )
        using txt
        options(
        path "./input/user.txt",
        dateFormat "yyyy/MM/dd"
        )
select startDate, EndDate from ABC

结果: |开始日期 |结束日期 | |:---------|:---------| |2016-06-12 |2016-06-15| |2016-06-12 |2016-06-15|

【讨论】:

    【解决方案3】:

    我发现了另一种在 Spark 2.0 预览版上使用 SparkSQL 中的函数的方法

    TO_DATE(from_unixtime(unix_timestamp(regexp_replace(startDate , '/','-'),'MM-dd-yyyy'))) AS startDate 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-03
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多