Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何将数据帧的所有行存储到本地值(例如并发队列)?_Apache Spark_Pyspark_Pyspark Sql - Fatal编程技术网

Apache spark 如何将数据帧的所有行存储到本地值(例如并发队列)?

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.

我正在尝试迭代使用sparksql(pyspark)执行结构化查询得到的行。代码大致如下所示:

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))
您试图用固定模式更改数据帧的值,这是您收到错误的主要原因。当然,谢谢!队列是在驱动程序上定义的,我认为每个执行者都有一个队列的副本。我误解了执行模块