使用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)。有没有办法用火花来做到这一点?
答案 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。