2016-11-19 2 views
0

Я использую искру 1.6.2 Java API, чтобы загрузить некоторые данные в Dataframe DF1, который выглядит как:Partition Искра Dataframe на основе конкретного столбца и сбросить содержимое каждого раздела на CSV

Key Value 
A v1 
A v2 
B v3 
A v4 

Теперь мне нужно разбить DF1 на подмножество значения в столбце «Ключ» и выгрузить каждый раздел в файл csv (используя искро-csv).

Желаемая Выход:

A.csv

Key Value 
A v1 
A v2 
A v4 

B.csv

Key Value 
B v3 

В настоящее время, что я делаю строю HashMap (MyList), содержащее подмножество значения, которые мне нужно фильтровать, а затем итерации через эту фильтрацию для каждого итерации другого Ключа. С помощью следующего кода я получаю то, что хочу, но мне интересно, если есть более эффективный способ сделать это:

DF1 = <some operations>.cache(); 

for (Object filterKey: myList.keySet()) { 
    DF2 = DF1.filter((String)myList.get(filterKey)); 

    DF2.write().format.format("com.databricks.spark.csv") 
      .option("header", "true") 
     .save("/" + filterKey + ".csv"); 
} 

ответ

1

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

DF1 
    .filter{case(key, value) => myList.contains(key)) 
    .write 
    .partitionBy("key") 
    .format("com.databricks.spark.csv") 
    .option("header", "true") 
    .save("/my/basepath/") 

Файлы будут сохранены в разделе "/ мой/BasePath/ключ = A /", "/ мой/BasePath/ключ = B /", и т.д ..

Смежные вопросы