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

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

我在amazon上启动了一个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时,如何提取这些信息并将其存储在列中?

我认为您缺少的是分区的概念。如果将表定义为已分区,则可以根据文件的时间戳(在名称中)将数据划分为不同的分区。我能够在
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;