我在rdbms中有一个表格,日期格式是' 1986-12-01'。 我正在使用hive .08而不是.12。
当我将数据导入hive时,我的时间戳为null,是否有任何选项直接从文件填充表中的数据(数据非常大)。或者我必须使用带有String的阶段表,然后使用函数将数据转换为timetamp,如果是这样的话会是什么样的?
谢谢!
答案 0 :(得分:3)
我将基于MySQL回答你,因为我在这篇文章中看到了一个带有RDMS名称的标签。那么,你有三个选择。
我假设您使用Sqoop 导入数据。此工具有一个选项,允许您导出SQL查询的结果。在该查询中,您可以使用将日期转换为时间戳的MySQL方法 UNIX_TIMESTAMP(日期,格式)。 Sqoop指令将是这样的:
sqoop import --connect jdbc:mysql://mysqlhost/mysqldb \
--username user \
--password passwd \
--query "SELECT col_1, ..., UNIX_TIMESTAMP(STR_TO_DATE(date_col, '%Y-%m-%d')) FROM table1 WHERE \$CONDITIONS" \
-m 1 \
--target-dir hive_table1_data`
请注意 WHERE \ $ CONDITIONS是强制性的。此外,我假设您的日期列是一个字符串。但如果它是日期类型,则不需要方法 str_to_date 。
在这一点上,我将假设你有权在该数据库中创建视图。
其他解决方案是创建一个视图,其中包含转换为时间戳的字段日期。如下所示,该函数是 UNIX_TIMESTAMP(日期,格式)。 Here您有更多详细信息。在你的情况下,你应该写这样的东西:
CREATE VIEW view_to_export AS
SELECT
fields1,
...,
UNIX_TIMESTAMP(STR_TO_DATE(field_date, '%Y-%m-%d'));
假设您的日期字段是字符串数据类型,如果它是日期数据类型,则不需要方法 str_to_date 。 sqoop指令将是这样的:
sqoop import --connect jdbc:mysql://mysqlhost/mysqldb \
--username user \
--password passwd \
--table mysql_table_name \
-m 1 \
--target-dir hive_table1_data
那么,有了这个观点,你可以毫无问题地将它与sqoop一起使用。
如果您使用其他类型的导入系统,但您已将数据存储到HDFS中。您可以创建另一个具有该字段转换的新表。要做到这一点,你可以使用这样的东西:
INSERT INTO TABLE my_table
SELECT
col_1,
...,
unix_timestamp(date_col, 'yyyy-MM-dd')
)
FROM exported_table;
在这种情况下,您需要更多时间来处理。但它独立于您导入数据的方式,并且使用来自MySQL服务器的资源较少,因为您不必计算每行的日期到时间戳的转换。 您将其委托给Hadoop 哪个任务处理大量数据。