LOAD DATA INPATH 将相同的基于 CSV 的数据加载到两个不同的外部 Hive 表中

Posted

技术标签:

【中文标题】LOAD DATA INPATH 将相同的基于 CSV 的数据加载到两个不同的外部 Hive 表中【英文标题】:LOAD DATA INPATH loads same CSV-base data into two different and external Hive tables 【发布时间】:2016-12-13 20:56:46 【问题描述】:

我有两个 CSV 文件上传到 HDInsight 中的 Azure Blob 存储。我可以毫无问题地将这两个文件上传到集群。然后我用...创建两个 Hive 表

CREATE EXTERNAL TABLE IF NOT EXISTS hive_table1(id int, age string, date string...) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\;' STORED AS TEXTFILE LOCATION '/user/hive/warehouse'

类似的语法适用于另一个表。

现在我想将第一个 CSV 文件加载到第一个表中,将第二个 CSV 文件加载到第二个表中(导致不对应的列)。

我用...

LOAD DATA INPATH '/file/file1.csv' OVERWRITE INTO TABLE hive_table1;

...并且能够将 CSV 文件数据加载到第一个表中。 但是...,不仅第一个数据集加载到第一个 Hive 表中,它将完全相同的文件数据加载到 第二个 蜂巢表。

显然,我only希望将第一个数据集加载到一个表中,将第二个distinct数据集only加载到另一个表中.

谁能帮忙指出错误或提供可能的解决方案?

提前致谢。

【问题讨论】:

【参考方案1】:

看起来您只需要为第二个表指定不同的“位置”。当您执行“加载数据”时,Hive 实际上是将数据复制到该路径中。如果两个表具有相同的“位置”,它们将共享相同的数据。

【讨论】:

你完全正确!这解决了这个问题。我不知道这种行为,因为这是第一次使用 HDInsight、Hadoop、Hive 等。我赞成你的答案 Rick,但由于我的代表低于 15 分,所以它不可见。感谢您抽出时间并努力帮助我。这也适用于你 Farooque 和 Sathiyan。谢谢大家!高度赞赏。【参考方案2】:

您的位置是造成问题的原因。您为两张桌子提供了相同的位置。由于表是外部的,文件将直接在您的路径下创建。

LOAD DATA INPATH '/file/file1.csv' OVERWRITE INTO TABLE hive_table1; 也将覆盖已经存在的文件。这就是你的桌子发生的事情。正如 Farooque 提到的,对于不同的表,位置应该是唯一的才能获得所需的结果。

【讨论】:

【参考方案3】:

我看到您正在创建 external 表并创建 2 个表,每个表都有一个文件。

您必须遵循以下简单步骤:

创建表

CREATE EXTERNAL TABLE IF NOT EXISTS hive_table1(id int, age string, date string...) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ';' STORED AS TEXTFILE LOCATION '/user/hive/warehouse/table1_dir/'

将文件复制到 HDFS 位置

hdfs dfs -put '/file/file1.csv' '/user/hive/warehouse/table1_dir/'

第二张表类似

创建表

CREATE EXTERNAL TABLE IF NOT EXISTS hive_table2(id int, age string, date string...) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ';' STORED AS TEXTFILE LOCATION '/user/hive/warehouse/table2_dir/'

将文件复制到 HDFS 位置

hdfs dfs -put '/file/file2.csv' '/user/hive/warehouse/table2_dir/'

注意:如果您使用多个表,那么它们的位置应该是唯一的。

【讨论】:

以上是关于LOAD DATA INPATH 将相同的基于 CSV 的数据加载到两个不同的外部 Hive 表中的主要内容,如果未能解决你的问题,请参考以下文章