-
看起来您所需的输出需要一些数据,这些数据是路径文件位置、设备和传感器的一部分,但是它没有定义为表定义的一部分,只有表定义或传感器中的列
virtual columns
将提供。
-
几个小文件可能会影响查询的性能(但这不会影响所需的结果)
-
所有的数据。分区指向文件夹,在这种情况下,您试图访问特定的文件
-
您想要的输出基本上是将一条记录分解成多条记录,这不应该在表定义中处理,可以通过select语句来完成
-
配置单元分区的命名约定为
partitionname=partitionvalue
,这不是强制性的,但如果您希望提前使用命令根据文件夹结构自动添加分区,则此选项非常有用。
如果您主要通过传感器或设备进行查询,我会这样解决您的问题
farm_iot/sensor_data/farm/farm0001/sensor01/1541252701443
至农场物联网/传感器数据/农场/设备=农场0001/传感器=传感器01/1541252701443
CREATE EXTERNAL TABLE IF NOT EXISTS farm.sensor_data (
temperature double,
preassure double,
humidity double
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1'
) LOCATION 's3://farm-iot/sensor_data/farm/'
PARTITIONED BY (device string, sensor string)
TBLPROPERTIES ('has_encrypted_data'='false')
查询您的数据
我们缺少时间戳,它本质上是json输入文件名的一部分。我们可以在select语句中使用虚拟列包含文件名
INPUT__FILE__NAME
如下
select device, sensor, temperature, preassure, humidity, INPUT__FILE__NAME as mytimestamp from farm.sensor_data
如果您需要预压力、温度和湿度以及不同的行,我建议您使用这三个行创建一个数组并将其分解,使用UNION ALL运行3个查询以附加结果应该会非常有效
如果遵循配置单元约定,则可以利用该命令
msck repair table
ALTER TABLE test ADD PARTITION (device='farm0001', sensor='sensor01') location 's3://farm_iot/sensor_data/farm/farm0001/sensor01'
我试图尽可能多地增加细节。如果有不清楚的地方,请告诉我。
编辑:
如果您的查询主要基于时间序列(例如日期范围),我建议在日级别添加一个分区(不小于此分区),以提高查询的性能。因此,您的表定义如下所示
CREATE EXTERNAL TABLE IF NOT EXISTS farm.sensor_data (
temperature double,
preassure double,
humidity double
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1'
) LOCATION 's3://farm-iot/sensor_data/farm/'
PARTITIONED BY (dt=long, device string, sensor string)
TBLPROPERTIES ('has_encrypted_data'='false')
农场物联网/传感器数据/农场/dt=20191204/设备=farm0001/传感器=sensor01/1541252701443
作为说明,您不需要为每个新分区修改表,只需将这些分区添加到表中,这基本上就是Hive知道新分区已创建的方式。如果您决定使用分区,这是唯一的方法,如果您不这样做(这将影响性能),那么还有其他一些方法可以让它工作
编辑2:
如果您希望保持数据结构不变,并且不使用分区,那么可以得到如下预期结果
CREATE EXTERNAL TABLE IF NOT EXISTS yourdb.sensordata (
temperature double,
pressure double,
humidity double
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1'
)
LOCATION 's3://farm-iot/sensor_data/farm/'
TBLPROPERTIES ('has_encrypted_data'='false');
SET hive.mapred.supports.subdirectories=TRUE;
SET mapred.input.dir.recursive=TRUE;
select * from yourdb.sensordata;
select
split(input__file__name, "/")[size(split(input__file__name, "/")) - 1] as ts,
split(input__file__name, "/")[size(split(input__file__name, "/")) - 3] as device,
split(input__file__name, "/")[size(split(input__file__name, "/")) - 2] as sensor,
'temperature' as data_point,
temperature as value
from yourdb.sensordata
union all
select
split(input__file__name, "/")[size(split(input__file__name, "/")) - 1] as ts,
split(input__file__name, "/")[size(split(input__file__name, "/")) - 3] as device,
split(input__file__name, "/")[size(split(input__file__name, "/")) - 2] as sensor,
'pressure' as data_point,
pressure as value
from yourdb.sensordata
union all
select
split(input__file__name, "/")[size(split(input__file__name, "/")) - 1] as ts,
split(input__file__name, "/")[size(split(input__file__name, "/")) - 3] as device,
split(input__file__name, "/")[size(split(input__file__name, "/")) - 2] as sensor,
'humidity' as data_point,
humidity as value
from yourdb.sensordata;
ts,device,sensor,_data_point,value
1541252701443,farm0001,sensor01,temperature,14.78
1541252701443,farm0001,sensor01,pressure,961.7
1541252701443,farm0001,sensor01,humidity,68.32