Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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 将列值用作spark DataFrame函数的参数_Apache Spark_Pyspark_Apache Spark Sql_Pyspark Sql - Fatal编程技术网

Apache spark 将列值用作spark DataFrame函数的参数

Apache spark 将列值用作spark DataFrame函数的参数,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,考虑以下数据帧: +---+--+ |信| rpt| +---+--+ |X | 3| |Y | 1| |Z | 2| +---+--+ 可以使用以下代码创建: df=spark.createDataFrame[X,3,Y,1,Z,2],[letter,rpt] 假设我想按列rpt中指定的次数重复每一行,如下所示 一种方法是使用以下pyspark sql查询将我的问题复制到该问题: 查询= 挑选* 从…起 选择DISTINCT*, PosSplitRepeat,,rpt,AS index,col

考虑以下数据帧:

+---+--+ |信| rpt| +---+--+ |X | 3| |Y | 1| |Z | 2| +---+--+ 可以使用以下代码创建:

df=spark.createDataFrame[X,3,Y,1,Z,2],[letter,rpt] 假设我想按列rpt中指定的次数重复每一行,如下所示

一种方法是使用以下pyspark sql查询将我的问题复制到该问题:

查询= 挑选* 从…起 选择DISTINCT*, PosSplitRepeat,,rpt,AS index,col 从df作为 其中索引>0 query=query.replace\n,用空格替换换行符,避免EOF错误 spark.sqlquery.dropcol.sort'letter',index.show +---+--+---+ |字母| rpt |索引| +---+--+---+ |X | 3 | 1| |X | 3 | 2| |X | 3 | 3| |Y | 1 | 1| |Z | 2 | 1| |Z | 2 | 2| +---+--+---+ 这是有效的,并产生正确的答案。但是,我无法使用DataFrame API函数复制此行为

我试过:

导入pyspark.sql.f函数 选择 f、 posexplodef.splitf.repeat、、f.colrpt、、别名索引、列 显示 但这导致:

TypeError:“列”对象不可调用

为什么我可以将该列作为输入传递给查询中的重复项,但不能从API传递?有没有办法使用spark DataFrame函数复制此行为?

一个选项是使用,它允许您使用列值作为spark sql函数的输入

基于@user8371915,我发现以下方法有效:

从pyspark.sql.functions导入expr 选择 '*', expr'posexplodesplitrepeat,,rpt',别名索引,列 .where'index>0.dropcol.sort'letter',index.show +---+--+---+ |字母| rpt |索引| +---+--+---+ |X | 3 | 1| |X | 3 | 2| |X | 3 | 3| |Y | 1 | 1| |Z | 2 | 1| |Z | 2 | 2| +---+--+---+ 一个选项是使用,它允许您使用列值作为sparksql函数的输入

基于@user8371915,我发现以下方法有效:

从pyspark.sql.functions导入expr 选择 '*', expr'posexplodesplitrepeat,,rpt',别名索引,列 .where'index>0.dropcol.sort'letter',index.show +---+--+---+ |字母| rpt |索引| +---+--+---+ |X | 3 | 1| |X | 3 | 2| |X | 3 | 3| |Y | 1 | 1| |Z | 2 | 1| |Z | 2 | 2| +---+--+---+
f、 exprrepeat,,rpt而不是f.repeat,,f.colrpt?@user8371915 df.选择“*”,f.expr'posexplodesplitrepeat,,rpt',.aliasindex,col.where'index>0.dropcol.sort'letter',index.show works。您知道这是否是将列用作参数的唯一方法吗?为什么它在SQL语法中工作?@ USER 831915请考虑将您的建议作为答案,并且可以从我的问题中编辑它。我认为这对将来的其他人是有益的。f.exprrepeat,,rpt而不是f.repeat,,f.colrpt?@user8371915 df。选择“*”,f.expr'posexplodessplitrepeat,,rpt,,.aliasindex,col.where'index>0”。dropcol.sort'letter',index.show works。您知道这是否是将列用作参数的唯一方法吗?为什么它在SQL语法中工作?@ USER 831915请考虑将您的建议作为答案,并且可以从我的问题中编辑它。我认为这对将来的其他人是有益的。