1

У меня есть память в памяти. Я хотел бы сгруппировать RDD с помощью некоторой произвольной функции, а затем выписать каждую отдельную группу как отдельный файл Parquet.Выполните группу на RDD в Spark и напишите каждую группу как отдельный файл Parquet

Например, если мой РДД состоит из JSON строки вида:

{"type":"finish","resolution":"success","csr_id": 214} 
{"type":"create","resolution":"failure","csr_id": 321} 
{"type":"action","resolution":"success","csr_id": 262} 

Я хочу, чтобы сгруппировать строки JSON свойства «типа», и записать каждую группу строк с тем же «type» в тот же файл Parquet.

я могу видеть, что DataFrame API позволяет писать паркетные файлы следующим образом (например, если РДД состоит из JSON строк):

final JavaRDD<String> rdd = ... 
final SQLContext sqlContext = SQLContext.getOrCreate(rdd.context()); 
final DataFrame dataFrame = sqlContext.read().json(rdd); 
dataFrame.write().parquet(location); 

Это означало бы, что весь DataFrame записывается в Паркетном файл, поэтому файл Parquet будет содержать записи с разными значениями для свойства type.

Dataframe API также предоставляет функцию GroupBy:

final GroupedData groupedData = dataFrame.groupBy(this::myFunction); 

Но GroupedData API, как представляется, не предоставлять какую-либо функцию для записи из каждой группы в отдельный файл.

Любые идеи?

ответ

3

Вы не можете написать GroupedData, но вы можете разбить данные на записи:

dataFrame.write.partitionBy("type").format("parquet").save("/tmp/foo") 

Каждый тип будет записан в отдельный каталог с форматом ${column}=${value}. Их можно загрузить отдельно:

sqlContext.read.parquet("/tmp/foo/type=action").show 
// +------+----------+ 
// |csr_id|resolution| 
// +------+----------+ 
// | 262| success| 
// +------+----------+