我在亚马逊上启动了一个EC2集群来安装cloudera ...我安装并配置了它并将一些Wiki页面视图公共快照加载到HDFS中。文件的结构如下:
projectcode, pagename, pageviews, bytes
文件的名称如下:
pagecounts-20090430-230000.gz
date time
将数据从HDFS加载到Impala时,我这样做:
CREATE EXTERNAL TABLE wikiPgvws
(
project_code varchar(100),
page_name varchar(1000),
page_views int,
page_bytes int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
LOCATION '/user/hdfs';
我错过的一件事是每个文件的日期和时间。主持人:
/user/hdfs
包含与不同日期和时间相关联的多个pagecount文件。如何在加载到impala时拉出该信息并将其存储在列中?
答案 0 :(得分:0)
我认为你缺少的是分区的概念。如果将表定义为已分区,则可以根据文件的时间戳(名称)将数据划分为不同的分区。我能够在hive
中解决这个问题,我希望您为impala
做必要的(如果有的话),因为查询语法是相同的。
对我来说,仅使用hive
无法解决此问题。所以我把bash与hive脚本混合在一起,它对我来说很好。这就是我把它包起来的方式:
wikiPgvws
wikiTmp
相同的字段创建表wikiPgvws
,但分区对于每个文件
i。将数据加载到wikiTmp
中
来自fileName的 ii。 grep
timeStamp
iii。使用sed
替换预定义hql
脚本文件中的占位符,以将数据加载到实际表中。然后运行它。
删除表wikiTmp
&删除tmp.hql
脚本如下:
#!/bin/bash
hive -e "CREATE EXTERNAL TABLE wikiPgvws(
project_code varchar(100),
page_name varchar(1000),
page_views int,
page_bytes int
)
PARTITIONED BY(dts STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS TEXTFILE";
hive -e "CREATE TABLE wikiTmp(
project_code varchar(100),
page_name varchar(1000),
page_views int,
page_bytes int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS TEXTFILE"
for fileName in $(hadoop fs -ls /user/hdfs/bounty/pagecounts-*.txt | grep -Po '(?<=\s)(/user.*$)')
do
echo "currentFile :$fileName"
dst=$(echo $filename | grep -oE '[0-9]{8}-[0-9]{6}')
echo "currentStamp $dst"
sed "s!sourceFile!'$fileName'!" t.hql > tmp.hql
sed -i "s!targetPartition!$dst!" tmp.hql
hive -f tmp.hql
done
hive -e "DROP TABLE wikiTmp"
rm -f tmp.hql
hql
脚本只包含两行:
LOAD DATA INPATH sourceFile OVERWRITE INTO TABLE wikiTmp;
INSERT OVERWRITE TABLE wikiPgvws PARTITION (dts = 'targetPartition') SELECT w.* FROM wikiTmp w;
后记:
检查,选项是否等同于hive -e
&amp; hive -f
中提供了impala
。没有它们,这个脚本对你没用。再次使用grep命令获取fileName&amp; timeStamp需要根据您的表位置和图章模式进行修改。它只是展示工作如何完成的一种方式,但无法找到另一种工作。
<强> Enhencement 强>
如果一切正常,请考虑将前两个DDL合并到另一个脚本中,使其看起来更干净。虽然,我不确定hql
脚本参数是否可用于定义分区值,但您仍然可以查看替换sed
。