让我们假设我每天以一种格式存储一个文件:
/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表中的文件?
答案 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)
不移动文件:
移动文件:
在/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
加载分区
alter table tableName add partition (dt=2016-07-31);
答案 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")