2015-09-12 58 views
0

您好我有Java的String数组,它包含45字符串,它基本上是列名如何从Java String数组创建Spark广播变量?

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

目前我储存在Spark驱动程序字符串的上述阵列中的一个静态字段。我的工作运行缓慢,因此试图重构代码。我使用上面的字符串数组,同时创造一个数据帧

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[]。当你想访问这个值时,你只需在变量上调用value()。从你的例子它会像:

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

请注意,如果您在使用Java编写这一点,你可能想在JavaSparkContext内包裹SparkContext。它使一切都变得简单,并且您可以避免必须将ClassTag传递给广播功能。

您可以在http://spark.apache.org/docs/latest/programming-guide.html#broadcast-variables

+0

JavaSparkContext的解释很好,所以我不必包含可选项。 – 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) 
    )