Apache spark 如何将数据帧的所有行存储到本地值(例如并发队列)?
我正在尝试迭代使用sparksql(pyspark)执行结构化查询得到的行。代码大致如下所示:Apache spark 如何将数据帧的所有行存储到本地值(例如并发队列)?,apache-spark,pyspark,pyspark-sql,Apache Spark,Pyspark,Pyspark Sql,我正在尝试迭代使用sparksql(pyspark)执行结构化查询得到的行。代码大致如下所示: spark = SparkSession \ .builder \ .appName("Sessions")\ .config(...) \ .getOrCreate() stuff = spark.read.format("parquet").options(mergeSchema=False).load(location) result_set = spark.
spark = SparkSession \
.builder \
.appName("Sessions")\
.config(...) \
.getOrCreate()
stuff = spark.read.format("parquet").options(mergeSchema=False).load(location)
result_set = spark.sql("""sql without udfs or anything too funky""")
result_set.foreach(lambda t: queue.put(t))
队列
是一个局部变量-一个简单的并发队列
当代码到达这一行时,我得到以下错误:
pickle.PicklingError:无法序列化对象:AttributeError:
“内置函数”或“方法”对象没有属性“代码”
在迭代之前调用
collect
,但我想知道执行这种遍历的惯用方法是什么?为什么上面的代码不起作用?您正在调用DataFrame,它将序列化并分发lambda以在执行器上的每个分区上运行。因此,如果确实要将行推送到队列,则需要在lambda中初始化队列。在这种情况下可能更合适,因此您可以对每个分区和每行初始化队列客户端一次。或者,如果您知道数据大小很小,您可以调用收集并在驱动程序上对结果进行排队。如果您想在节点上对数据进行排队,然后在本地使用,则需要使用。否则,在foreach
中推送到队列的所有内容都不会在本地更改任何内容
您可以阅读有关共享变量(累加器和广播)的信息。pickle。PicklingError
表示您试图填充错误的数据类型,而不是在模式中定义的数据类型。您可以用队列是什么来更新问题吗result\u set
是一个数据帧,通过执行result\u set.foreach(lambda t:queue.put(t))
您试图用固定模式更改数据帧的值,这是您收到错误的主要原因。当然,谢谢!队列是在驱动程序上定义的,我认为每个执行者都有一个队列的副本。我误解了执行模块