【问题标题】:add date time from flat file name cloudera从平面文件名 cloudera 添加日期时间
【发布时间】:2015-01-21 16:04:48
【问题描述】:

我在亚马逊上启动了一个 EC2 集群来安装 cloudera...我安装并配置了它,并将一些 Wiki Page Views 公共快照加载到 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 时如何提取这些信息并将其存储在列中?

【问题讨论】:

    标签: hadoop cloudera hadoop-streaming impala


    【解决方案1】:

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

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

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

    4. 删除表 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 -ehive -f 等价的选项是否在impala 中可用。没有它们,这个脚本对你毫无用处。同样,需要根据您的表位置和戳模式修改用于获取文件名和时间戳的 grep 命令。这只是展示如何完成工作的一种方式,但找不到另一种方式。

    增强
    如果一切正常,请考虑将前两个 DDL 合并到另一个脚本中以使其看起来更干净。虽然,我不确定hql 脚本参数是否可用于定义分区值,但您仍然可以看看替换sed

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 2015-11-17
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多