【问题标题】:Adding a comma separated table to Hive将逗号分隔的表添加到 Hive
【发布时间】:2018-02-22 17:18:16
【问题描述】:

我有一个非常基本的问题:如何向 Hive 添加一个非常简单的表。我的表保存在一个文本文件 (.txt) 中,该文件保存在 HDFS 中。我试图在 Hive 中创建一个指向该文件的外部表,但是当我运行 SQL 查询(从 table_name 中选择 *)时,我没有得到任何输出。 这是一个示例代码:

create external table Data (
    dummy INT,
    account_number INT, 
    balance INT, 
    firstname STRING, 
    lastname STRING, 
    age INT, 
    gender CHAR(1), 
    address STRING, 
    employer STRING, 
    email STRING,
    city STRING, 
    state CHAR(2)
)
LOCATION 'hdfs:///KibTEst/Data.txt';

KibTEst/Data.txt 是文本文件在 HDFS 中的路径。

表格中的行用回车分隔,列用逗号分隔。

感谢您的帮助!

【问题讨论】:

  • 你的文件是在HDFS还是表中??

标签: hive hdfs


【解决方案1】:
  1. 您只需要创建一个指向您的文件的外部表 在 hdfs 中的位置和分隔符属性如下:

    create external table Data (
        dummy INT,
        account_number INT, 
        balance INT, 
        firstname STRING, 
        lastname STRING, 
        age INT, 
        gender CHAR(1), 
        address STRING, 
        employer STRING, 
        email STRING,
        city STRING, 
        state CHAR(2)
    )
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ',' 
    LINES TERMINATED BY '\n'
    LOCATION 'hdfs:///KibTEst/Data.txt';
    
  2. 你需要运行select查询(因为文件已经在HDFS中,当create语句中指定位置时,外部表直接从中获取数据)。所以你使用下面的 select 语句进行测试:

SELECT * FROM Data;

【讨论】:

  • 使用此代码可以成功创建表,但是当我运行 SQL 查询时它不返回任何输出(它只返回 OK)。这看起来像 Hive 中的表是空的。我通过运行hadoop fs -cat /KibTest/Data.txt 仔细检查了 HDFS 中的表内容,它返回了表的内容。
  • 你将位置更新为 '/KibTest/Data.txt' 然后你会得到结果,因为如果你运行 'hadoop fs -cat hdfs:///KibTEst/Data.txt' 你不会得到任何东西......
  • 这给出了相同的结果。但是,从路径中删除文件名(使位置变为/KibTest/)可以完成工作,尽管目录中的所有文件都插入到表中!所以我必须创建一个新目录并只将这个文件移动到其中。不知道有没有什么办法可以限制输入到路径中的一个文件?
  • 要限制目录中单个文件的任何特定路径,您必须将位置指定为文件名而不是目录名。
  • 是的,我明白这一点,但是正如上一条评论中所写,当我在路径中包含文件名时,结果是一个空表,我可以在其中看到该目录中所有文件的数据(包括我需要)从路径中删除文件名时
【解决方案2】:
    create external table Data (
        dummy INT,
        account_number INT, 
        balance INT, 
        firstname STRING, 
        lastname STRING, 
        age INT, 
        gender CHAR(1), 
        address STRING, 
        employer STRING, 
        email STRING,
        city STRING, 
        state CHAR(2)
    )
    row format delimited    
    FIELDS TERMINATED BY ‘,’
    stored as textfile
    LOCATION 'Your hdfs location for external table';

如果数据在 HDFS 中,则使用:

LOAD DATA INPATH 'hdfs_file_or_directory_path' INTO TABLE tablename

使用select * from table_name

【讨论】:

  • 非常感谢! Your hdfs location for external table 是指 HDFS 中的位置(即hdfs:///KibTEst/Data.txt)吗?这个和hdfs_file_or_directory_path有什么区别?
【解决方案3】:
create external table Data (
        dummy INT,
        account_number INT, 
        balance INT, 
        firstname STRING, 
        lastname STRING, 
        age INT, 
        gender CHAR(1), 
        address STRING, 
        employer STRING, 
        email STRING,
        city STRING, 
        state CHAR(2)
    )
    row format delimited    
    FIELDS TERMINATED BY ','
    stored as textfile
    LOCATION '/Data';

然后将文件加载到表中

LOAD DATA INPATH '/KibTEst/Data.txt' INTO TABLE Data;

然后

select * from Data;

【讨论】:

  • 感谢您的回答!我尝试输入相同的命令,但出现以下错误(这是之前的几个选项之一,我总是遇到相同的错误): ParseException line 16:26 mismatched input ',' expecting StringLiteral near 'BY' in table row格式的字段分隔符
  • 现在可以无错误地创建表,但是当我通过运行 SQL 查询select * from Data 检查它的内容时,我没有得到任何输出(只有 OK)。使用 Load 命令不起作用,但会出现以下错误:FAILED: SemanticException Line 1:17 Invalid path ''/KibTEst/Data.txt'': No files match path hdfs://MACHINE_NAME/KibTEst/Data .txt 我试图将路径更改为hdfs:///KibTEst/Data.txt,但它给出了完全相同的错误(具有相同的路径)。但是我认为不需要加载语句,因为表是外部的并且数据存在于 HDFS 中
  • 什么是 KibTEst?你的 Data.txt 放在哪里??
  • KibTEst 是 HDFS 中放置我的文件 (Data.txt) 的文件夹的名称。
【解决方案4】:

我希望,下面的输入将尝试回答 @mshabeen 提出的问题。

您可以使用不同的方式将数据加载到作为外部表创建的 Hive 表中。 在创建 Hive 外部表时,您可以使用 LOCATION 选项并指定 HDFS、S3(如果是 AWS)或文件位置,您可以从其中加载数据您可以使用 @ 987654323@ 创建 Hive 表后从 HDFS、S3 或文件加载数据的选项。

您也可以使用ALTER TABLE 命令在 Hive 分区中加载数据。

以下是一些细节

  1. 使用LOCATION - 在创建 Hive 表时使用。在这种情况下,数据已经加载并在 Hive 表中可用。

  2. **LOAD DATA INPATH** 选项 - 此 Hive 命令可用于从指定位置加载数据。这里要记住的是,数据将从输入路径移动到 Hive 仓库路径。 例子 - LOAD DATA INPATH 'hdfs://cluster-ip/path/to/data/location/'

  3. 使用 ALTER TABLE 命令 - 主要用于将来自其他位置的数据添加到 Hive 分区中。在这种情况下,要求所有分区都已定义并且分区的值是已知的。如果是动态分区,则不需要此命令。 例子 - ALTER TABLE table_name ADD PARTITION (date_col='2018-02-21') LOCATION 'hdfs/path/to/location/' 上面的代码会将分区映射到指定的数据位置(在本例中为 HDFS)。但是,数据不会移动到 Hive 内部仓库位置。

更多详情可here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多