PySpark: как читать в столбцах разбиения при чтении паркета - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть данные, хранящиеся в файлах паркета и таблице кустов, разделенные по годам, месяцам и дням.Таким образом, каждый файл паркета хранится в папке /table_name/year/month/day/.

Я хочу прочитать данные только для некоторых разделов.У меня есть список путей к отдельным разделам следующим образом:

paths_to_files = ['hdfs://data/table_name/2018/10/29',
                  'hdfs://data/table_name/2018/10/30']

А затем попробуйте сделать что-то вроде:

df = sqlContext.read.format("parquet").load(paths_to_files)

Однако, тогда мои данные не включают информацию о year, month and day, поскольку это не часть данных как таковых, скорее информация хранится в пути к файлу.

Я мог бы использовать контекст sql и запрос на отправку куста с некоторым оператором select с указанием места в году., столбцы месяца и дня для выбора только данных из интересующих меня разделов. Однако я бы предпочел не создавать SQL-запросы в python, так как я очень ленив и не люблю читать SQL.

У меня есть два вопроса:

  1. Какой оптимальный (с точки зрения производительности) способ считывания данных, хранящихся в виде паркета, где информация о году, месяце, дне отсутствует в паркетефайл, но включен только в путь к файлу?(либо отправьте запрос улья, используя sqlContext.sql('...'), либо используйте read.parquet, ... что-нибудь действительно.
  2. Могу ли я каким-то образом извлечь столбцы разбиения при использовании подхода, описанного выше?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Ваши данные не хранятся оптимальным образом для паркета, поэтому вам придется загружать файлы один за другим и добавлять даты

Кроме того, вы можете переместить файлы в структуру каталогов, подходящую для паркета(например ... / table / year = 2018 / month = 10 / day = 29 / file.parquet), тогда вы можете прочитать родительский каталог (таблица) и отфильтровать по году, месяцу и дню (и spark будет читать толькосоответствующие каталоги) также вы получите их в качестве атрибутов в вашем фрейме данных

0 голосов
/ 30 ноября 2018

Чтение прямых путей к файлу родительского каталога разделов года должно быть достаточным для того, чтобы информационный фрейм определил, что в нем есть разделы.Однако он не знал бы, например, как называть разделы без структуры каталогов /year=2018/month=10.

Следовательно, если у вас есть Hive, то лучше будет проходить через метасторку, потому что там названы разделы, Hive хранит дополнительную полезную информацию о вашей таблице, и тогда вы не уверены, что знаете прямой путь кфайлы на диске из кода Spark.

Не уверен, почему вы думаете, что вам нужно читать / писать SQL, хотя.

Вместо этого используйте API Dataframe, например,

df = spark.table("table_name")
df_2018 = df.filter(df['year'] == 2018)
df_2018.show() 
...