从平面文件名cloudera添加日期时间

时间:2015-01-21 16:04:49

标签: hadoop cloudera hadoop-streaming impala

我在亚马逊上启动了一个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时拉出该信息并将其存储在列中?

1 个答案:

答案 0 :(得分:0)

我认为你缺少的是分区的概念。如果将表定义为已分区,则可以根据文件的时间戳(名称)将数据划分为不同的分区。我能够在hive中解决这个问题,我希望您为impala做必要的(如果有的话),因为查询语法是相同的。

对我来说,仅使用hive无法解决此问题。所以我把bash与hive脚本混合在一起,它对我来说很好。这就是我把它包起来的方式:

  1. 使用分区
  2. 创建表wikiPgvws
  3. 使用与wikiTmp相同的字段创建表wikiPgvws,但分区
  4. 除外
  5. 对于每个文件
       i。将数据加载到wikiTmp中   来自fileName的 ii。 grep timeStamp
       iii。使用sed替换预定义hql脚本文件中的占位符,以将数据加载到实际表中。然后运行它。

  6. 删除表wikiTmp&删除tmp.hql

  7. 脚本如下:

    #!/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