【发布时间】:2020-08-29 03:22:15
【问题描述】:
从 (2007q1 - 2020q3) 开始,我有名为“yearquarter”的镶木地板文件夹。我正在创建的配置单元表应仅从 2014q1 到 2020q2 提取数据。我如何做到这一点?
【问题讨论】:
-
这是 hive 问题还是 scala spark 问题?
从 (2007q1 - 2020q3) 开始,我有名为“yearquarter”的镶木地板文件夹。我正在创建的配置单元表应仅从 2014q1 到 2020q2 提取数据。我如何做到这一点?
【问题讨论】:
您必须更改 parquet 文件夹名称并为其添加前缀,例如 yearquarter=2001q1(例如),它指示存储这些值的列,因此它位于顶级文件夹下的层次结构中(名为 @987654322 @ 下面)。
table_name
|
- yearquarter=2001q1
- yearquarter=2001q2
.
.
- yearquarter=2020q3
基于 Hive 的解决方案:
然后,您将创建一个位于顶级文件夹的external hive 表。您选择external,以便设置位置。表架构应与文件中的列标签相对应。
CREATE EXTERNAL TABLE TABLE_NAME (
col_name1 HIVE_TYPE,
...,
col_nameN HIVE_TYPE)
PARTITIONED BY (yearquarter STRING)
STORED AS PARQUET
LOCATION '/location/to/your/table_name';
在您的文件夹层次结构上有一个按文件夹分区的配置单元表后,您可以创建一个配置单元视图,它使用 WHERE 子句到 SELECT 子集。
CREATE VIEW view_name
AS SELECT *
FROM table_name
WHERE yearquarter >= "2014q1" AND yearquarter <= "2020q2";
从此视图执行SELECT 将提供所需的范围。
基于 Spark 的解决方案:
您创建一个读取顶级位置的DataFrame。因为您存储了像yearquarter=2001q1 这样的层次结构,所以这些值会自动读入标记为yearquarter 的列中。
// Read parquet hierarchy. The schema (if present) is automatically detected.
val df = spark.read.parquet("/location/to/your/table_name")
// Set filter condition to use.
val filterCondition = col("yearquarter") >= "2014q1" && col("yearquarter") <= "2020q2"
// Filter according to condition.
val filtered = df.filter(filterCondition)
【讨论】: