Python PySpark中的分组反转
我不确定这个问题本身是否正确。我找到的SQL解决方案在配置单元SQL中不起作用,或者禁止递归。 因此,我想用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| +----
+--------+----------+
|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()