在sparksql中使用“/”分隔符从原始数据加载日期列

guz6ccqo  于 2021-06-29  发布在  Hive
关注(0)|答案(2)|浏览(388)

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

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

pgx2nnw8

pgx2nnw81#

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

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

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

以上都是如何在Hive中实现的。要在spark中处理这个问题,还需要首先将它们作为字符串加载到Dataframe中。

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|
+----------+----------+

希望这有帮助。

xa9qqrwz

xa9qqrwz2#

我在sparkql的spark2.0预览版上找到了另外一种方法

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

相关问题