使用 multidelimeter 在配置单元中插入数据
Insert data in hive using multidelimeter
如何使用 multidelimeter 在 hive 中插入数据并且列之间没有指定分隔符。
以下是我的数据:
25380 20130101 2.514 -135.69 58.43 8.3 1.1 4.7 4.9 5.6 0.01 C 1.0 -0.1 0.4 97.3 36.0 69.4 -99.000 -99.000 -99.000 -99.000 -99.000 -9999.0 -9999.0 -9999.0 -9999.0 -9999.0
25380 20130102 2.514 -135.69 58.43 3.0 -0.3 1.4 1.2 0.0 0.35 C 1.3 -1.0 -0.1 100.0 89.5 98.2 -99.000 -99.000 -99.000 -99.000 -99.000 -9999.0 -9999.0 -9999.0 -9999.0 -9999.0
我只想在我的配置单元中插入前 7 列 table,并且我有一个包含上述数据的 txt 文件。
创建 table 脚本:
CREATE TABLE hotcold (a int,b int,c float,d float,e float,f float,g float,h string,i string,j string,k string,l string,m string,n string,o string,p string,q string,
r string,s string,t string,u string,v string,w string,x string,y string,z string,aa string,bb string,cc string,dd string,ee string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ('input.regex'='\s+');
我的数据插入脚本如下:
LOAD DATA LOCAL INPATH '/home/cloudera/WeatherData.txt' into table hotcold;
下面是我的 select 语句和错误:
select * from hotcold;
错误:
Failed with exception java.io.IOException:org.apache.hadoop.hive.serde2.SerDeException: Number of matching groups doesn't match the number of columns
每一列都应该在正则表达式中有相应的捕获组 ()
。
下面例子中第一组在字符串开头^(\d+)
-对应正整数,
\s+
- 一个或多个空白定界符,
第二个捕获组对应正整数(\d+)
,
再次 \s+
- 一个或多个空白定界符,
第三个捕获组 - ([+-]?[0-9.]+)
- 一个浮点数,格式不是很严格,允许 +- 符号以及点和点的任意组合
和 .*
最后允许字符串末尾的任何字符,未捕获,将所有其他列添加到正则表达式,我的示例包含三列(三个捕获组)的正则表达式:
WITH SERDEPROPERTIES ('input.regex'='^(\d+)\s+(\d+)\s+([+-]?[0-9.]+).*')
阅读此内容了解更多详情:Using Regular Expressions to Extract Fields for Hive Tables
如何使用 multidelimeter 在 hive 中插入数据并且列之间没有指定分隔符。
以下是我的数据:
25380 20130101 2.514 -135.69 58.43 8.3 1.1 4.7 4.9 5.6 0.01 C 1.0 -0.1 0.4 97.3 36.0 69.4 -99.000 -99.000 -99.000 -99.000 -99.000 -9999.0 -9999.0 -9999.0 -9999.0 -9999.0
25380 20130102 2.514 -135.69 58.43 3.0 -0.3 1.4 1.2 0.0 0.35 C 1.3 -1.0 -0.1 100.0 89.5 98.2 -99.000 -99.000 -99.000 -99.000 -99.000 -9999.0 -9999.0 -9999.0 -9999.0 -9999.0
我只想在我的配置单元中插入前 7 列 table,并且我有一个包含上述数据的 txt 文件。
创建 table 脚本:
CREATE TABLE hotcold (a int,b int,c float,d float,e float,f float,g float,h string,i string,j string,k string,l string,m string,n string,o string,p string,q string,
r string,s string,t string,u string,v string,w string,x string,y string,z string,aa string,bb string,cc string,dd string,ee string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ('input.regex'='\s+');
我的数据插入脚本如下:
LOAD DATA LOCAL INPATH '/home/cloudera/WeatherData.txt' into table hotcold;
下面是我的 select 语句和错误:
select * from hotcold;
错误:
Failed with exception java.io.IOException:org.apache.hadoop.hive.serde2.SerDeException: Number of matching groups doesn't match the number of columns
每一列都应该在正则表达式中有相应的捕获组 ()
。
下面例子中第一组在字符串开头^(\d+)
-对应正整数,
\s+
- 一个或多个空白定界符,
第二个捕获组对应正整数(\d+)
,
再次 \s+
- 一个或多个空白定界符,
第三个捕获组 - ([+-]?[0-9.]+)
- 一个浮点数,格式不是很严格,允许 +- 符号以及点和点的任意组合
和 .*
最后允许字符串末尾的任何字符,未捕获,将所有其他列添加到正则表达式,我的示例包含三列(三个捕获组)的正则表达式:
WITH SERDEPROPERTIES ('input.regex'='^(\d+)\s+(\d+)\s+([+-]?[0-9.]+).*')
阅读此内容了解更多详情:Using Regular Expressions to Extract Fields for Hive Tables