Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.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
Python PySpark中的分组反转_Python_Apache Spark_Pyspark_Pivot_Unpivot - Fatal编程技术网

Python PySpark中的分组反转

Python PySpark中的分组反转,python,apache-spark,pyspark,pivot,unpivot,Python,Apache Spark,Pyspark,Pivot,Unpivot,我不确定这个问题本身是否正确。我找到的SQL解决方案在配置单元SQL中不起作用,或者禁止递归。 因此,我想用Pyspark解决这个问题,需要一个解决方案,或者至少是一些想法,如何解决这个问题 我有一张原始表格,看起来像这样: +--------+----------+ |customer|nr_tickets| +--------+----------+ | A| 3| | B| 1| | C| 2| +----

我不确定这个问题本身是否正确。我找到的SQL解决方案在配置单元SQL中不起作用,或者禁止递归。 因此,我想用Pyspark解决这个问题,需要一个解决方案,或者至少是一些想法,如何解决这个问题

我有一张原始表格,看起来像这样:

+--------+----------+
|customer|nr_tickets|
+--------+----------+
|       A|         3|
|       B|         1|
|       C|         2|
+--------+----------+
这就是我想要的桌子:

+--------+
|customer|
+--------+
|       A|
|       A|
|       A|
|       B|
|       C|
|       C|
+--------+
你有什么建议吗


提前非常感谢

您可以通过对行(组)进行迭代来创建新的数据帧

使用
范围(int(a[“nr_票证”)

您可以将这些数据存储并附加到列表中,然后使用它生成数据帧

 df= spark.createDataFrame(df_list)
总的来说

from pyspark.sql import Row

df_list = []
for a in df.select(["customer","nr_tickets"]).collect():
  df_list = df_list + [Row(customer=a["customer"]) for T in range(int(a["nr_tickets"]))]
df= spark.createDataFrame(df_list)
df.show()
你也可以通过列表理解来完成

from pyspark.sql import Row
from functools import reduce #python 3

df_list = [
[Row(customer=a["customer"])]*int(a["nr_tickets"]) 
for a in df.select(["customer","nr_tickets"]).collect() 
 ]

df= spark.createDataFrame(reduce(lambda x,y: x+y,df_list))
df.show()
产生

+--------+
|customer|
+--------+
|       A|
|       A|
|       A|
|       B|
|       C|
|       C|
+--------+

对于
Spark2.4+
,使用
数组_repeat
分解

from pyspark.sql import functions as F

df.selectExpr("""explode(array_repeat(customer,cast(nr_tickets as int))) as customer""").show()

#+--------+
#|customer|
#+--------+
#|       A|
#|       A|
#|       A|
#|       B|
#|       C|
#|       C|
#+--------+

与此同时,我自己也找到了一个解决方案:

for i in range(1, max_nr_of_tickets):
    table = table.filter(F.col('nr_tickets') >= 1).union(test)
    table = table.withColumn('nr_tickets', F.col('nr_tickets') - 1)
说明:DFs“表”和“测试”在开始时是相同的。 所以“最大票数”就是最高的“票数”。它起作用了。 我只是在为最大数字的格式而挣扎:

max_nr_of_tickets = df.select(F.max('nr_tickets')).collect()
我不能在for循环的范围内使用结果,因为它是一个列表。所以我手动输入最高的数字。 有什么办法可以把最大票数转换成正确的格式,这样循环范围就可以接受吗


谢谢

嗨,谢谢你的解决方案。我已经试过了,但是它说“array\u repeat”是未知的:未定义的函数:“array\u repeat”。此函数既不是已注册的临时函数,也不是在数据库“default”中注册的永久函数。很遗憾,检查我的Sparkversion也不起作用。但它应该在2.0以上。我们的spark版本低于2.4。这种方法不适用于uStupid问题,但我如何找到我的spark版本?”sc.version“不起作用嗨,谢谢你的帮助。代码的“总体”版本生成的列表确实是正确的。但是到df的转换在某种程度上对我不起作用,当我使用df.show():Py4JJavaError:调用o153.showString时出错:org.apache.spark.sparkeexception:作业因阶段失败而中止:阶段6.0中的任务0失败4次,最近的失败:阶段6.0中的任务0.3丢失(TID 12,sdeb-hdpdn-q3014a.sys.schwarz,executor 2):org.apache.spark.api.python.python异常:回溯(最后一次调用):文件“/hadoop/disk10/hadoop/thread/local/usercache/bnem2103/appcache/application_1598371445148_44504/container_e247_1598371445148_44504_01_000003/pyspark.zip/pyspark/worker.py”,主行第125行(“%d.%d.%d”%sys.version_info[:2],version))异常:worker中的Python与driver 3.8中的Python版本3.6不同,PySpark无法使用不同的次要版本运行。请检查环境变量PySpark_Python和PySpark_driver_Python是否正确设置。在使用“列表理解”版本时,我遇到相同/类似的错误。您在哪里运行spark?
max_nr_of_tickets = df.select(F.max('nr_tickets')).collect()