在 sparkSQL 中使用'/'分隔符从原始数据加载日期列



我在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

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

我以前在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|
+----------+----------+

我知道现在回答这个问题有点晚了,但是,在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-12 || 2016-06-12 | 2016-06-12 |

我找到了另一种方法,使用Spark 2.0预览版中的SparkSQL函数

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

相关内容

  • 没有找到相关文章

最新更新