Паркетный файл - Временные ряды с переменной частотой
Моя ситуация такова:
- У меня есть список из сотен параметров временных рядов
- Каждый параметр не зависит друг от друга
- Каждый параметр имеет базовую частоту (скажем, 10 Гц), но из-за аппаратных ограничений может быть сохранено от 9 до 11 Гц (переменная частота).
- Каждый параметр имеет различную базовую частоту
- Обычно мне нужно читать только несколько параметров (столбцов) за раз и "соединять их" по метке времени.
Мои вопросы:
- Как вы думаете, паркет будет подходящим форматом файла, учитывая это краткое описание?
- Может ли паркет иметь дело с переменной частотой? Другими словами, сохраняет ли это временную метку, связанную с каждым значением?
2 ответа
Сам Паркет не ставит метки времени на данные, вам нужно сделать это самостоятельно, добавив дополнительное поле, в котором вы будете хранить метки времени каждого отдельного чтения. Если вы знаете частоту, с которой каждый параметр был прочитан, его легко преобразовать в метку времени перед вставкой данных в файл.
Следующая проблема, с которой вы столкнетесь, состоит в том, что параметры не будут считываться точно в одно и то же время, поэтому вы должны учитывать это в любых вычислениях, которые вам нужно делать с вашими данными. На данный момент у вас есть много разных вариантов в зависимости от ваших потребностей и характера ваших данных, я просто упомяну один. Для непрерывных переменных вы можете пересчитать свои данные так, чтобы временные метки были одинаковыми для каждого параметра. Вы можете сделать это, интерполируя свои показания в реальном времени, чтобы вычислить показания в целевом времени. Есть много математических соображений на данный момент, но они выходят за рамки вашего вопроса и актуальности формата хранения.
Короче 1. да 2. нет
Я бы посоветовал сохранять данные в разных файлах на частоту, если разница больше 5, то есть один - 5 Гц, а другой - 10 Гц. Другой подход состоит в том, чтобы заполнить пробелы нулем, чтобы данные хотели что-то вроде этого
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()