我在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
然后它正确地获取数据
日期分隔符是'/'时如何处理数据?
我不想替换输入文件中的分隔符
请帮我。感谢。
答案 0 :(得分:2)
我之前在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|
+----------+----------+
希望这有帮助。
答案 1 :(得分:0)
我在Spark 2.0预览版
中使用SparkSQL中的函数找到了另一种方法TO_DATE(from_unixtime(unix_timestamp(regexp_replace(startDate , '/','-'),'MM-dd-yyyy'))) AS startDate