在 sparkSQL 中使用“/”分隔符从原始数据加载日期列
Load Date Column from raw data with '/' separator in 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';
然后我使用字符串函数从上面的字段中提取 date/month/year。例如
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 2.0 预览版上使用 SparkSQL 中的函数找到了另一种方法
TO_DATE(from_unixtime(unix_timestamp(regexp_replace(startDate , '/','-'),'MM-dd-yyyy'))) AS startDate
我知道现在回答这个问题有点晚了,但是,在 SPARK 中,您还可以在选项中包含 dateFormat
而创建 table。
这会将您的日期格式从 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|
我在 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';
然后我使用字符串函数从上面的字段中提取 date/month/year。例如
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 2.0 预览版上使用 SparkSQL 中的函数找到了另一种方法
TO_DATE(from_unixtime(unix_timestamp(regexp_replace(startDate , '/','-'),'MM-dd-yyyy'))) AS startDate
我知道现在回答这个问题有点晚了,但是,在 SPARK 中,您还可以在选项中包含 dateFormat
而创建 table。
这会将您的日期格式从 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|