从在线数据集中将数据加载到 Hive 表后获取 NULL 值

Posted

技术标签:

【中文标题】从在线数据集中将数据加载到 Hive 表后获取 NULL 值【英文标题】:Getting NULL values after loading data into Hive tables from an online dataset 【发布时间】:2020-10-14 14:04:00 【问题描述】:

我正在尝试使用 hue 界面将在线数据集中的数据加载到我的配置单元表中,但我得到的是 NULL 值。

这是我的数据集:

https://www.kaggle.com/psparks/instacart-market-basket-analysis?select=aisles.csv

这是我的代码:

CREATE TABLE IF NOT EXISTS AISLES (aisles_id INT, aisles STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
tblproperties("skip.header.line.count"="1");

这是我加载数据的方式:

LOAD DATA LOCAL INPATH '/home/hadoop/aisles.csv' INTO TABLE aisles;

我的解决方法,但不行:

FIELDS TERMINATED BY ','
FIELDS TERMINATED BY '\t'
FIELDS TERMINATED BY ''
FIELDS TERMINATED BY ' '

还尝试删除LINES TERMINATED BY '\n'

这是我下载数​​据的方式:

[hadoop@ip-172-31-76-58 ~]$ wget -O aisles.csv "https://www.kaggle.com/psparks/instacart-market-basket-analysis?select=aisles.csv"
--2020-10-14 23:50:06--  https://www.kaggle.com/psparks/instacart-market-basket-analysis?select=aisles.csv
Resolving www.kaggle.com (www.kaggle.com)... 35.244.233.98
Connecting to www.kaggle.com (www.kaggle.com)|35.244.233.98|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘aisles.csv’

我检查了我创建的表的位置,这是它所说的;

hdfs://ip-172-31-76-58.ec2.internal:8020/user/hive/warehouse/aisles 

我尝试浏览目录并查看文件的保存位置:

[hadoop@ip-172-31-76-58 ~]$ hdfs dfs -ls /user/hive/warehouse
Found 1 items
drwxrwxrwt   - arjiesaenz hadoop          0 2020-10-15 00:57 /user/hive/warehouse/aisles

所以,我尝试像这样更改我的加载脚本;

LOAD DATA INPATH '/user/hive/warehouse/aisles.csv' INTO TABLE aisles;

但我得到了一个错误:

Error while compiling statement: FAILED: SemanticException line 6:61 Invalid path ''/user/hive/warehouse/aisles.csv'': No files matching path hdfs://ip-172-31-76-58.ec2.internal:8020/user/hive/warehouse/aisles.csv

希望有人可以帮助我查明我的代码的问题。

谢谢。

【问题讨论】:

【参考方案1】:

我在我的 hadoop 集群上尝试了同样的方法。该代码工作没有任何问题。 这是我的执行 sn-p:

    hive> CREATE TABLE IF NOT EXISTS AISLES (aisles_id INT, aisles STRING)
    > ROW FORMAT DELIMITED
    > FIELDS TERMINATED BY ','
    > LINES TERMINATED BY '\n'
    > STORED AS TEXTFILE
    > tblproperties("skip.header.line.count"="1");
OK
Time taken: 0.034 seconds
hive> load data inpath '/user/hirwuser1448/aisles.csv' into table AISLES;
Loading data to table revisit.aisles
Table revisit.aisles stats: [numFiles=1, totalSize=2603]
OK
Time taken: 0.183 seconds
hive> select * from AISLES limit 10;
OK
1       prepared soups salads
2       specialty cheeses
3       energy granola bars
4       instant foods
5       marinades meat preparation
6       other
7       packaged meat
8       bakery desserts
9       pasta sauce
10      kitchen supplies
Time taken: 0.038 seconds, Fetched: 10 row(s)

我认为您需要交叉检查您的数据集 aisles.csv 是否位于 hdfs 位置,而不是存储在本地目录中。

问题在于您的加载 cmd。

LOAD DATA INPATH '/user/hive/warehouse/aisles.csv' INTO TABLE aisles;

我看到您尝试浏览目录以查看保存的文件。你在那个目录下看到 aisles.csv 了吗?如果文件在那里,那么你在加载 cmd 中给出了错误的路径,否则文件根本不存在。

【讨论】:

嗨,Ayush,当我下载数据集时,它只是说保存到:'aisles.csv'。不是完整的目录路径。我是新手,但这就是我检查 aisles.csv hdfs dfs -ls /user/hive/warehouse 的路径的方法 找到 1 项 drwxrwxrwt - arjiesaenz hadoop 0 2020-10-15 00:57 /user/ hive/warehouse/aisles 像这样更改了我的加载脚本,但它说没有匹配的文件错误: LOAD DATA INPATH '/user/hive/warehouse/aisles.csv' INTO TABLE aisles;而且我还尝试了 LOAD DATA INPATH '/user/hive/warehouse/aisles' INTO TABLE aisles; @Tyrell,你得到了错误,因为文件不存在。只需交叉验证您下载数据集的位置并在加载 cmd 中提供该路径/aisles.csv。【参考方案2】:

我通过下载数据集并将其上传到 Amazon S3 存储桶并在 LOAD 命令中使用 S3 路径找到了解决方法。

【讨论】:

以上是关于从在线数据集中将数据加载到 Hive 表后获取 NULL 值的主要内容,如果未能解决你的问题,请参考以下文章

转储数据集时将数据从 Hive 加载到 Pig 错误

Hive 分区表 - 尝试将数据从一个表加载到我的 Hive 中的分区表并得到 [错误 10044]*

sqoop export 无法将数据从 hive 仓库文件夹加载到 mysql

将数据加载到 Hive 数组列

SAS - 如何从数据集中获取最后的“n”个观察结果?

hive使用教程(2)--数据导入导出、查询与排序