考虑以下数据frame:
#+------+---+
#|letter|rpt|
#+------+---+
#| X| 3|
#| Y| 1|
#| Z| 2|
#+------+---+
df = spark.createDataFrame([("X", 3),("Y", 1),("Z", 2)], ["letter", "rpt"])
query = """
SELECT *
FROM
(SELECT DISTINCT *,
posexplode(split(repeat(",", rpt), ",")) AS (index, col)
FROM df) AS a
WHERE index > 0
"""
query = query.replace("\n", " ") # replace newlines with spaces, avoid EOF error
spark.sql(query).drop("col").sort('letter', 'index').show()
#+------+---+-----+
#|letter|rpt|index|
#+------+---+-----+
#| X| 3| 1|
#| X| 3| 2|
#| X| 3| 3|
#| Y| 1| 1|
#| Z| 2| 1|
#| Z| 2| 2|
#+------+---+-----+
import pyspark.sql.functions as f
df.select(
f.posexplode(f.split(f.repeat(",", f.col("rpt")), ",")).alias("index", "col")
).show()
为什么我能够将列作为输入传递给查询中的repeat
,而不是从API传递?是否有一种方法可以使用spark DataFrame函数复制这种行为?
一种选择是使用pyspark.sql.functions.expr
,这允许您使用列值作为spark-sql函数的输入。
根据@user8371915的评论,我发现以下作品:
from pyspark.sql.functions import expr
df.select(
'*',
expr('posexplode(split(repeat(",", rpt), ","))').alias("index", "col")
).where('index > 0').drop("col").sort('letter', 'index').show()
#+------+---+-----+
#|letter|rpt|index|
#+------+---+-----+
#| X| 3| 1|
#| X| 3| 2|
#| X| 3| 3|
#| Y| 1| 1|
#| Z| 2| 1|
#| Z| 2| 2|
#+------+---+-----+
函数可以作为其它函数的参数进行传递,然后在其它函数内调用执行,一般称之为回调。下面是一个将函数作为参数的简单例子(function_parameter.go): package main import ( "fmt" ) func main() { callback(1, Add) } func Add(a, b int) { fmt.Printf("The sum
问题内容: 如何使用Python列表(例如)作为函数的参数,例如: 问题答案: 您可以使用splat运算符执行此操作: 这使函数将每个列表项作为单独的参数接收。这里有一个描述:http : //docs.python.org/tutorial/controlflow.html#unpacking- argument-lists
我正试图将dataframe列作为参数传递 但是得到错误 :33:错误:类型不匹配; 找到:org.apache.spark.sql.column 必需:int val df_new=df.withcolumn(“age_category”,ageclassification.agecategory(df(“age”))
问题内容: 如何在不执行“父”函数或不使用函数的情况下将函数作为参数传递?(因为我已经读到它是不安全的。) 我有这个: 它可以工作,但是问题是在调用函数时触发,而不是在函数中使用时触发。 根据我所读的内容,我可以使用来解决它,但这不是最佳实践。如何在JavaScript中将函数作为参数传递? 问题答案: 您只需要删除括号: 然后,这将传递函数而不先执行它。 这是一个例子:
问题内容: 这似乎是一个愚蠢的问题,但是此函数是否会实际影响变量(我将如何使用此变量的上下文更大,但这基本上是我不确定的问题)?(我专门问有关java) 问题答案: 考虑一个稍微不同的示例: 运行该程序的输出为: 该变量将更改为true,但是一旦方法返回,该参数变量就会消失(这就是人们所说的“超出范围”的意思)。但是,传递给方法的变量保持不变。
问题内容: 我该怎么做-在swift中传递两个NSStringDrawing选项作为函数参数: 问题答案: 编辑:在 Swift 3.0中 : 编辑: 这就是您将在Swift 2.0中使用选项枚举的方式 : 编辑: 此问题 已在iOS 8.3 SDK Beta 1(12F5027d)中得到解决 : 修改后的[struct] 从: 至: 您现在可以编写: 经过一番研究和@Anton Tcholako