Apache spark 将数据从数据流写入拼花地板

Apache spark 将数据从数据流写入拼花地板,apache-spark,apache-spark-sql,spark-streaming,pyspark,Apache Spark,Apache Spark Sql,Spark Streaming,Pyspark,使用pyspark从kinesis获取数据后,我有一个数据流,其中包含如下条目: ('filename_1', [{'name': 'test'}, {'name': 'more'}, {'name': 'other'}]) ('filename_2', [{'age': 15}, {'age': 25}]) 我现在要做的是将元组的第二部分写入元组的第一部分标识的位置 在其他地方,我使用以下方法将每个字典列表转换为数据帧: dataframe = sqlContext.createDataFr

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

('filename_1', [{'name': 'test'}, {'name': 'more'}, {'name': 'other'}])
('filename_2', [{'age': 15}, {'age': 25}])
我现在要做的是将元组的第二部分写入元组的第一部分标识的位置

在其他地方,我使用以下方法将每个字典列表转换为数据帧:

dataframe = sqlContext.createDataFrame(list_of_dicts)
并用类似于:

dataframe.write.parquet('filename')
我现在的问题是如何将数据流中的每一行转换为数据帧。我的直觉是使用地图获得每一条线并进行转换。这将需要一个sqlContext,您实际上无法将其传递给映射函数,因为它会因以下错误而失败:

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)。使用spark有没有办法做到这一点?

您可以在
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());
words.foreachRDD(
新功能2(){
@凌驾
公共Void调用(JavaRDD,Time){
SQLContext SQLContext=JavaSQLContextSingleton.getInstance(rdd.context());

有关更多详细信息,您可以浏览一下。

据我所知,每个RDD可能仍然由多行组成(至少这就是为什么我认为在稍后链接的示例中会有地图的原因),所以我仍然无法将完整的RDD放入一个数据帧中,因为每一行都应该是它自己的数据帧。您不能在映射中使用sqlContext。它只在foreachRdd函数中工作。您是否通过了该链接?是的,这正是问题所在。每个RDD可能仍然包含多行,但由于每行都应该成为一个数据帧,因此我结束创建这样的构造:
用于名称中的名称:
`filtered=rdd.filter(lambda name\u记录:filter\u by\u name(name,name\u记录))`df=sqlc.createDataFrame(记录)`df.write.parquet(OUT\u PATH+name,mode='append'))`这不是最理想的。很抱歉代码格式错误。我不再被允许编辑这篇文章,这里是一个可读性更高的格式的代码:好吧,试试这个,首先使用
foreachRdd
函数从dstream获取所有RDD,然后使用
collect function
函数从每个RDD收集所有行作为列表。现在您拥有了所有的RDD这些行,将每一行转换为rdd,然后在自定义模式中使用该rdd创建数据帧。