在配置单元中加载外部表时如何忽略括号

vaqhlq81  于 2023-02-04  发布在  Hadoop
关注(0)|答案(2)|浏览(360)

我正在尝试将pig脚本的摘录作为配置单元中的外部表加载。pig将每一行括在括号()之间(元组?),如下所示:
(1、2、3、a)
(2、4、5、b)
(4、2、6、c)
我找不到方法告诉hive忽略那些括号,这会导致第一列的值为空,因为它实际上是一个整数。
你对如何进行有什么想法吗?
我知道我可以在pig中使用flatten命令,但我也想学习如何直接从hive处理这些文件。

a11xaf1n

a11xaf1n1#

正如本所说,没有办法一步到位。。但您可以通过在配置单元中再创建一个临时表来实现。
不知道我是不是又多了一张table让事情变得更复杂。。但对我有用。

create external table A_TEMP (first string,second int,third int,fourth string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n'
LOCATION '/user/hdfs/Adata';

将数据放在“adata”文件夹下

create external table A (first int,second int,third int,fourth string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n'
LOCATION '/user/hdfs/Afinaldata';

现在让我们插入数据

insert into table A
    select cast(substr(first, 2, length(first) - 2) as int),second,third,substr(fourth, 1,length(fourth) - 1 ) from A_TEMP;

我知道类型铸造会影响性能。。但对于给定的场景,这是我能想到的最好的方法。

ugmeyewa

ugmeyewa2#

这是不可能一步到位的。你得再走一步 flatten 在Pig或一个额外的Hive里 INSERT INTO .
在Hive里你可以用 split(string field, string pattern) 多次从外部表中读取并创建所需的列,然后将其加载到新表中。然而,我总是倾向于将pig输出转换成您想要的格式,除非从这个文件中读取的其他东西期望数据是这种格式。它将节省昂贵的所有数据重读。

相关问题