我希望在hive中对表的列进行编码。
我试过了:
hive> create table encode_test(id int, name STRING, phone STRING, address STRING)
> ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
> WITH SERDEPROPERTIES ('column.encode.columns'='phone,address', 'column.encode.classname'='org.apache.hadoop.hive.serde2.Base64WriteOnly') STORED AS TEXTFILE;
假设我有一个CSV文件,后面有一行
100,'navis','010-0000-0000','Seoul Seocho'
现在我尝试使用。
LOAD DATA LOCAL INPATH
'/home/path/to/csv/test.csv'
INTO TABLE encode_test;
但是在做Select * from encode_test i am getting all columns NULL
结果应该是
100 navis MDEwLTAwMDAtMDAwMA== U2VvdWwsIFNlb2Nobw==
另外,我想给Fields TERMINATED BY ','
IN创建表encode_test查询。
但我得到了error: EOF error Near Fields
我还尝试创建另一个表sample
create table sample(id int, name STRING, phone STRING, address STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
然后在sample
表中导入csv文件。它已成功导入。
然后我尝试使用。
insert into encode_test select * from sample;
但是我收到了这个新错误
Permission denied: user=root, access=WRITE, inode="/user":h dfs:supergroup:drwxr-xr-x
at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.c heckFsPermission(DefaultAuthorizationProvider.java:279)
我是hadoop的新手
请参阅我尝试此问题的this link
答案 0 :(得分:1)
在Hive DDL中,ROW FORMAT SERDE
和FIELDS TERMINATED BY
无法共存。相反,您可以使用field.delim
serde属性。
create table encode_test(id int, name STRING, phone STRING, address STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
'field.delim'=',',
'column.encode.columns'='phone,address',
'column.encode.classname'='org.apache.hadoop.hive.serde2.Base64WriteOnly')
STORED AS TEXTFILE;
对于PermissionDenied
例外,请将hive查询作为hdfs
或hive
用户运行,因为root
用户没有WRITE
访问HDFS。