Чтение различных схем в структуре Parquet Partitioned Dir

У меня есть следующие разделенные паркетные данные на hdfs, написанные с помощью искры:

year
 |---Month
      |----monthlydata.parquet
      |----Day
            |---dailydata.parquet

Теперь, когда я читаю df from year path, искра читает dailydata.parquet. Как я могу читать ежемесячные данные со всех разделов. Я попытался использовать параметр настройки mergeSchema = true, который дает ошибку.


person Patel    schedule 30.03.2017    source источник


Ответы (1)


Я настоятельно рекомендую вам перестать делать следующее:

year
 |---Month
      |----monthlydata.parquet
      |----Day
            |---dailydata.parquet

Когда вы читаете year/month/ или даже просто year/, вы не просто получите monthlydata.parquet, вы также получите dailydata.parquet. Я не могу много говорить об ошибке, которую вы получаете (пожалуйста, опубликуйте ее), но я скромно предлагаю разделить пути в HDFS, поскольку вы уже дублируете данные:

dailies
 |---year
     |---Month
          |----Day
                |---dailydata.parquet
monthlies
 |---year
     |---Month
          |----monthlydata.parquet

Есть ли причина, по которой вы держите их в одних и тех же каталогах?

Однако, если вы настаиваете на этой структуре, используйте что-то вроде этого:

schema = "dailydata1"
val dfList = dates.map { case (month, day) =>
  Try(sqlContext.read.parquet(s"/hdfs/table/month=$month/day=$day/$schema.parquet"))
}
val dfUnion = dfList.collect { case Success(v) => v }.reduce { (a, b) =>
  a.unionAll(b)
}

Где вы можете переключать schema между dailydata1, dailydata2 и т. Д.

person jackar    schedule 30.03.2017
comment
На самом деле это объектно-ориентированный дизайн, который я отражаю на hdfs ... Будет не один dailydata.parquet, а несколько других, например dailydata1.parquet с другой схемой (есть несколько уровней, которые я не хочу реплицировать по всей HDFS для разных объекты с тем же путем), и поскольку искра обеспечивает ленивую оценку, о том, что чтение не выполняется, позаботятся соответствующие фильтры. Ищу такие фильтры. - person Patel; 30.03.2017
comment
Могут ли быть dailydata1.parquet и dailydata2.parquet в один и тот же день в соответствии с вашим дизайном (т.е. /2017/03/30/dailydata1.parquet и /2017/03/30/dailydata2.parquet)? Проблема с вашим дизайном заключается в том, что вам понадобятся фильтры уровня кода для создания набора путей для чтения, а затем .unionAll фреймы данных вместе с сокращением. Я добавлю фрагмент кода в правку. - person jackar; 30.03.2017
comment
Хорошо. Я думаю, что это будет очень дорого для Spark. Верно? Я буду использовать разные каталоги для обоих. - person Patel; 31.03.2017