Parquet 文件 - 具有可变频率的时间序列
Parquet file - Timeseries with variable frequency
我的情况是:
- 我有一个包含数百个时间序列参数的列表
- 各参数相互独立
- 每个参数都有一个基本频率(假设为 10hz),但由于硬件限制,可能会保存 9 到 11hz(可变频率)。
- 每个参数都有不同的基频
- 通常情况下,我只需要一次读取其中的几个参数(列),然后 "join them" 按时间戳。
我的问题是:
- 鉴于此简短描述,您认为 parquet 是合适的文件格式吗?
- parquet可以处理变频吗?换句话说,它是否保存了与每个值关联的时间戳?
Parquet 本身不会为数据添加时间戳,您需要自己执行此操作,添加一个额外的字段,您将在其中存储每个单独读数的时间戳。如果您知道每个参数被读取的频率,那么在将数据插入文件之前转换为时间戳是微不足道的。
您将 运行 遇到的下一个问题是参数不会完全同时读取,因此您必须在需要对数据进行的任何计算中考虑到这一点。在这一点上,根据您的需要和数据的性质,您有许多不同的选择,我只提一个。对于连续变量,您可以对数据重新采样,以便每个参数的时间戳都相同。您可以通过在实际时间戳处插入读数来计算目标时间戳处的读数来做到这一点。在这一点上有很多数学上的考虑,但它们超出了你的问题的范围和存储格式的相关性。
简而言之
1. 是的
2. 没有
如果差异大于 5,即一个是 5Hz,另一个是 10Hz,我建议将数据保存在每个频率的不同文件中。
另一种方法是用 null 填充空白,这样数据就会像这样
schema = types.StructType([
types.StructField("timespeed", types.LongType(), False),
types.StructField("speed", types.LongType(), True),
types.StructField("tempature", types.LongType(), True)
])
data = [
(1, 6, 10),
(2, 7, None),
(3, None, None),
(4, 8, 11),
(5, 9, None)
]
df_w_schema = sqlContext.createDataFrame(data, schema)
df_w_schema.collect()
df_w_schema.write.parquet('nullable_check_w_schema')
df_parquet_w_schema = sqlContext.read.schema(schema).parquet('nullable_check_w_schema')
df_parquet_w_schema.printSchema()
我的情况是:
- 我有一个包含数百个时间序列参数的列表
- 各参数相互独立
- 每个参数都有一个基本频率(假设为 10hz),但由于硬件限制,可能会保存 9 到 11hz(可变频率)。
- 每个参数都有不同的基频
- 通常情况下,我只需要一次读取其中的几个参数(列),然后 "join them" 按时间戳。
我的问题是:
- 鉴于此简短描述,您认为 parquet 是合适的文件格式吗?
- parquet可以处理变频吗?换句话说,它是否保存了与每个值关联的时间戳?
Parquet 本身不会为数据添加时间戳,您需要自己执行此操作,添加一个额外的字段,您将在其中存储每个单独读数的时间戳。如果您知道每个参数被读取的频率,那么在将数据插入文件之前转换为时间戳是微不足道的。
您将 运行 遇到的下一个问题是参数不会完全同时读取,因此您必须在需要对数据进行的任何计算中考虑到这一点。在这一点上,根据您的需要和数据的性质,您有许多不同的选择,我只提一个。对于连续变量,您可以对数据重新采样,以便每个参数的时间戳都相同。您可以通过在实际时间戳处插入读数来计算目标时间戳处的读数来做到这一点。在这一点上有很多数学上的考虑,但它们超出了你的问题的范围和存储格式的相关性。
简而言之 1. 是的 2. 没有
如果差异大于 5,即一个是 5Hz,另一个是 10Hz,我建议将数据保存在每个频率的不同文件中。 另一种方法是用 null 填充空白,这样数据就会像这样
schema = types.StructType([
types.StructField("timespeed", types.LongType(), False),
types.StructField("speed", types.LongType(), True),
types.StructField("tempature", types.LongType(), True)
])
data = [
(1, 6, 10),
(2, 7, None),
(3, None, None),
(4, 8, 11),
(5, 9, None)
]
df_w_schema = sqlContext.createDataFrame(data, schema)
df_w_schema.collect()
df_w_schema.write.parquet('nullable_check_w_schema')
df_parquet_w_schema = sqlContext.read.schema(schema).parquet('nullable_check_w_schema')
df_parquet_w_schema.printSchema()