Hadoop 从平面文件名cloudera添加日期时间
我在amazon上启动了一个EC2集群来安装cloudera…我安装并配置了它,并将一些Wiki页面视图公共快照加载到HDFS中。文件的结构如下所示:Hadoop 从平面文件名cloudera添加日期时间,hadoop,cloudera,hadoop-streaming,impala,Hadoop,Cloudera,Hadoop Streaming,Impala,我在amazon上启动了一个EC2集群来安装cloudera…我安装并配置了它,并将一些Wiki页面视图公共快照加载到HDFS中。文件的结构如下所示: projectcode, pagename, pageviews, bytes 这些文件的名称如下: pagecounts-20090430-230000.gz date time 将数据从HDFS加载到Impala时,我会这样做: CREATE EXTERNAL TABLE wikiPgvws ( pr
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时,如何提取这些信息并将其存储在列中?我认为您缺少的是分区的概念。如果将表定义为已分区,则可以根据文件的时间戳(在名称中)将数据划分为不同的分区。我能够在
hive
中解决这个问题,我希望您能为impala
做必要的工作(如果有的话),因为那里的查询语法是相同的
对我来说,仅使用hive
无法解决此问题。所以我把bash和hive脚本混为一谈,对我来说效果很好。我是这样包装的:
wikiPgvws
wikiTmp
,除分区外,其他字段与wikiPgvws
相同i.将数据加载到
wikiTmp
ii.
grep
文件名的时间戳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
结语:检查
impala
中是否有与hive-e
和hive-f
等效的选项。没有它们,这个脚本对您没有任何用处。同样,用于获取文件名和时间戳的grep命令需要根据表位置和戳模式进行修改。这只是一种展示如何完成工作的方式,但无法找到另一种
增强如果一切正常,请考虑将前两个DDL合并成另一个脚本,使其看起来更干净。尽管我不确定
hql
脚本参数是否可以用于定义分区值,但您仍然可以查看一下如何替换sed
LOAD DATA INPATH sourceFile OVERWRITE INTO TABLE wikiTmp;
INSERT OVERWRITE TABLE wikiPgvws PARTITION (dts = 'targetPartition') SELECT w.* FROM wikiTmp w;