2015-09-12 2 views
0

Привет У меня есть Java String, массив, который содержит 45 строку, которая в основном имена столбцовКак создать переменную Spark broadcast из массива Java String?

String[] fieldNames = {"colname1","colname2",...}; 

В настоящее время я хранящие выше массив String, в драйвере Спарк в статическом поле. Моя работа работает медленно, поэтому пытаюсь выполнить код рефакторинга. Я использую выше строкового массива при создании DataFrame

DataFrame dfWithColNames = sourceFrame.toDF(fieldNames); 

Я хочу сделать выше, используя переменную широковещательный, что не грузим огромный массив строк каждому исполнителю, я считаю, что мы можем сделать что-то вроде следующего, чтобы создать трансляцию

String[] brArray = sc.broadcast(fieldNames,String[].class);//gives compilation error 

DataFrame df = sourceFrame.toDF(???);//how do I use above broadcast can I use it as is by passing brArray 

Просьба указать, что я новичок в Spark. Большое спасибо.

ответ

3

Возвращаемая переменная sc.broadcast имеет тип Broadcast<String[]>, а не String[]. Когда вы хотите получить доступ к значению, вы просто вызываете значение() для переменной. Из вашего примера было бы как:

Broadcast<String[]> broadcastedFieldNames = sc.broadcast(fieldNames) 
DataFrame df = sourceFrame.toDF(broadcastedFieldNames.value()) 

Обратите внимание, что если вы пишете это в Java, вы, вероятно, хотите, чтобы обернуть SparkContext в JavaSparkContext. Это упрощает работу, и вы можете избежать передачи ClassTag функции трансляции.

Вы можете прочитать больше о переменных вещания на http://spark.apache.org/docs/latest/programming-guide.html#broadcast-variables

+0

JavaSparkContext объяснение хорошее, так что я не должен включать classtag. – raksja

2

Это немного старый вопрос, однако, я надеюсь, что мое решение поможет кому-то.

Для того, чтобы транслировать какой-либо объект (может быть один POJO или коллекция) с искрой 2+ в первую очередь необходимо иметь следующий метод, который создает classTag для вас:

private static <T> ClassTag<T> classTag(Class<T> clazz) { 
    return scala.reflect.ClassManifestFactory.fromClass(clazz); 
} 

рядом вы используете JavaSparkContext от SparkSession вещать объект как ранее:

sparkSession.sparkContext().broadcast(
      yourObject, 
      classTag(YourObject.class) 
    ) 

в случае сбора, скажем, java.util.List, можно использовать следующее:

sparkSession.sparkContext().broadcast(
      yourObject, 
      classTag(List.class) 
    ) 
Смежные вопросы