Hadoop/Hive:在本地计算机上从.csv加载数据

mel*_*mel 35 sql csv hadoop hive amazon-web-services

因为这是来自新手......

我为我设置了Hadoop和Hive,因此我可以在计算机上运行Hive查询来访问AWS集群上的数据.我可以使用存储在计算机上的.csv数据运行Hive查询,就像我使用MS SQL Server一样吗?

如何将.csv数据加载到Hive中呢?它与Hadoop有什么关系以及我应该运行哪种模式?

我应该关注什么设置,这样如果我做错了什么我总是可以回去在亚马逊上运行查询而不会影响之前为我设置的内容?

小智 41

让我通过以下简单步骤为您完成工作:

脚步:

首先,使用csv文件中的字段名称在配置单元上创建一个表.让我们举例来说,你的csv文件包含三个字段(id,name,salary),你想在hive中创建一个名为"staff"的表.使用以下代码在配置单元中创建表.

hive> CREATE TABLE Staff (id int, name string, salary double) row format delimited fields terminated by ',';
Run Code Online (Sandbox Code Playgroud)

其次,既然您的表是在hive中创建的,那么让我们将csv文件中的数据加载到配置单元的"staff"表中.

hive>  LOAD DATA LOCAL INPATH '/home/yourcsvfile.csv' OVERWRITE INTO TABLE Staff;
Run Code Online (Sandbox Code Playgroud)

最后,在配置单元上显示"Staff"表的内容,以检查数据是否已成功加载

hive> SELECT * FROM Staff;
Run Code Online (Sandbox Code Playgroud)

谢谢.

  • 没有任何理由将其标记为已接受的答案? (4认同)
  • 在表创建期间设置分隔符并不直观.我希望能够在从特定文件加载数据时设置分隔符.如果新数据文件有不同的分隔符怎么办? (4认同)
  • 这里应该有双引号`终止于',";` (2认同)

hja*_*i52 15

如果你有一个配置单元,你可以直接使用Hdfs/s3中的Hive load命令放置本地数据集.

编写load命令时需要使用"Local"关键字.

hiveload命令的语法

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅以下链接. https://cwiki.apache.org/confluence/display/Hive/LanguageManual%20DML#LanguageManualDML-Loadingfilesintotables


Lex*_*ian 10

有另一种方法来实现这一点,

  1. 使用hadoop hdfs -copyFromLocal将.csv数据文件从本地计算机复制到HDFS中的某个位置,比如'/ path/filename'

  2. 进入Hive控制台,运行以下脚本从文件加载,使其成为Hive表.请注意,'\ 054'是八进制数字中'逗号'的ascii代码,表示字段分隔符.


CREATE EXTERNAL TABLE table name (foo INT, bar STRING)
 COMMENT 'from csv file'
 ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054'
 STORED AS TEXTFILE
 LOCATION '/path/filename';
Run Code Online (Sandbox Code Playgroud)


小智 6

你可以试试这个,以下是关于如何生成文件的几个例子。工具 -- https://sourceforge.net/projects/csvtohive/?source=directory

  1. 使用 Browse 选择一个 CSV 文件并设置 hadoop 根目录,例如:/user/bigdataproject/

  2. 工具使用所有 csv 文件生成 Hadoop 脚本,以下是生成的 Hadoop 脚本示例,用于将 csv 插入 Hadoop

    #!/bin/bash -v
    hadoop fs -put ./AllstarFull.csv /user/bigdataproject/AllstarFull.csv hive -f ./AllstarFull.hive

    hadoop fs -put ./Appearances.csv /user/bigdataproject/Appearances.csv hive -f ./Appearances.hive

    hadoop fs -put ./AwardsManagers.csv /user/bigdataproject/AwardsManagers.csv hive -f ./AwardsManagers.hive

    Run Code Online (Sandbox Code Playgroud)

  3. 生成的 Hive 脚本示例

    CREATE DATABASE IF NOT EXISTS lahman;
    USE lahman;
    CREATE TABLE AllstarFull (playerID string,yearID string,gameNum string,gameID string,teamID string,lgID string,GP string,startingPos string) row format delimited fields terminated by ',' stored as textfile;
    LOAD DATA INPATH '/user/bigdataproject/AllstarFull.csv' OVERWRITE INTO TABLE AllstarFull;
    SELECT * FROM AllstarFull;
    Run Code Online (Sandbox Code Playgroud)

谢谢维杰


Arp*_*pan 6

对于csv文件,格式数据将采用以下格式

"column1", "column2","column3","column4"
Run Code Online (Sandbox Code Playgroud)

如果我们使用以'结尾的字段,则每一列将获得如下所示的值。

"column1"    "column2"     "column3"     "column4"
Run Code Online (Sandbox Code Playgroud)

同样,如果任何列值具有commaas值,那么它将根本无法工作。

因此,创建表的正确方法是使用OpenCSVSerde

create table tableName (column1 datatype, column2 datatype , column3 datatype , column4 datatype)
ROW FORMAT SERDE 
'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
STORED AS TEXTFILE ;
Run Code Online (Sandbox Code Playgroud)

  • 缺点是,无论表如何定义,都将所有列保存为字符串。 (2认同)