将数据从dstream写入镶木地板

时间:2015-07-28 09:29:20

标签: apache-spark apache-spark-sql spark-streaming pyspark

使用pyspark从kinesis中获取数据后,我有一个dstream,其条目如下:

('filename_1', [{'name': 'test'}, {'name': 'more'}, {'name': 'other'}])
('filename_2', [{'age': 15}, {'age': 25}])

我现在要做的是将元组的第二部分写入元组第一部分所标识的位置。

在其他地方,我通过使用以下方法将每个词典列表转换为DataFrame来实现:

dataframe = sqlContext.createDataFrame(list_of_dicts)

并用以下内容写出来:

dataframe.write.parquet('filename')

我现在的问题是如何将dstream中的每一行转换为DataFrame。我的直觉是使用map来获取每一行并进行转换。这将需要一个sqlContext,您实际上无法传递给map函数,因为它失败并出现此错误:

Exception: It appears that you are attempting to reference SparkContext from a broadcast variable, action, or transforamtion. SparkContext can only be used on the driver, not in code that it run on workers. For more information, see SPARK-5063

我并不是完全依赖于镶木地板,但我需要某种架构(因此绕道去了DataFrame)。有没有办法用火花来做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以在foreach方法中创建新的SqlContext实例。

words.foreachRDD(
  new Function2<JavaRDD<String>, Time, Void>() {
    @Override
    public Void call(JavaRDD<String> rdd, Time time) {
      SQLContext sqlContext = JavaSQLContextSingleton.getInstance(rdd.context());

有关详细信息,请参阅此link