按日期范围读取Hive表中的多个文件

时间:2016-08-04 08:54:02

标签: hive

让我们假设我每天以一种格式存储一个文件:

/path/to/files/2016/07/31.csv
/path/to/files/2016/08/01.csv
/path/to/files/2016/08/02.csv

如何在给定日期范围内(例如2016-06-04至2016-08-03)读取单个Hive表中的文件?

3 个答案:

答案 0 :(得分:2)

假设每个文件都遵循相同的模式,我建议您使用以下命名约定存储文件:

/path/to/files/dt=2016-07-31/data.csv
/path/to/files/dt=2016-08-01/data.csv
/path/to/files/dt=2016-08-02/data.csv

然后,您可以创建一个由dt分区并指向位置/path/to/files/

的外部表格
CREATE EXTERNAL TABLE yourtable(id int, value int)
PARTITIONED BY (dt string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/path/to/files/'

如果您有多个分区,并且不想为每个分区编写alter table yourtable add partition ...个查询,则只需使用将自动添加分区的修复命令。

msck repair table yourtable

然后,您可以通过指定分区范围

简单地选择日期范围内的数据
SELECT * FROM yourtable WHERE dt BETWEEN '2016-06-04' and '2016-08-03'

答案 1 :(得分:0)

不移动文件:

  1. 设计表架构。在配置单元shell中,创建表(按日期分区)
  2. Loading files into tables
  3. 使用HiveQL查询(从表中选择*,其中dt介于'2016-06-04'和'2016-08-03')
  4. 移动文件:

    1. 设计表架构。在配置单元shell中,创建表(按日期分区)
    2. /path/to/files/2016/07/31.csv下移动/dbname.db/tableName/dt=2016-07-31,然后你就可以了 /dbname.db/tableName/dt=2016-07-31/file1.csv /dbname.db/tableName/dt=2016-08-01/file1.csv /dbname.db/tableName/dt=2016-08-02/file1.csv

    3. 加载分区 alter table tableName add partition (dt=2016-07-31);

    4. 请参阅Add partitions

答案 2 :(得分:0)

在Spark-shell中,阅读配置表

/path/to/data/user_info/dt=2016-07-31/0000-0

1.create sql

val sql = "CREATE EXTERNAL TABLE `user_info`( `userid` string, `name` string) PARTITIONED BY ( `dt` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'hdfs://.../data/user_info'"

2。跑吧

spark.sql(sql)

3.load data

val rlt= spark.sql("alter table user_info add partition (dt=2016-09-21)")

4.现在可以从表中选择数据

val df = spark.sql("select * from user_info")