Спарк написать паркет на основе алфавитного разделения - PullRequest
0 голосов
/ 17 мая 2018

Я много исследовал эту тему. У меня есть набор данных размером 3 ТБ. Ниже приведена схема данных для таблицы:

root
 |-- user: string (nullable = true)
 |-- attributes: array (nullable = true)
 |    |-- element: string (containsNull = true)

Каждый день я получаю список пользователей, для которых мне нужны атрибуты. Я хотел знать, смогу ли я написать вышеупомянутую схему в файл паркета с первыми 2 письмами пользователей. Например,

Omkar | [a,b,c,d,e]
Mac   | [a,b,c,d,e]
Zee   | [a,b,c,d,e]
Kim   | [a,b,c,d,e]
Kelly | [a,b,c,d,e]

На приведенном выше наборе данных я могу сделать что-то вроде этого:

spark.write.mode("overwrite").partitionBy("user".substr(0,2)).parquet("path/to/location")

Делая это, я чувствую, что данных, загруженных в память при следующем присоединении к пользователям, будет очень мало, поскольку мы можем использовать только эти разделы.

Есть ли комментарии, если кто-то реализовал подобное?

Спасибо !!

1 Ответ

0 голосов
/ 17 мая 2018

Можно. Просто замените ваш код на:

df
  .withColumn("prefix", $"user".substr(0,2)) // Add prefix column
  .write.mode("overwrite")            
  .partitionBy("prefix")                     // Use it for partitioning 
  .parquet("path/to/location")
...