Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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 3.x 在PySpark列表数据帧中的每个元素后追加一个值_Python 3.x_Dataframe_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Python 3.x 在PySpark列表数据帧中的每个元素后追加一个值

Python 3.x 在PySpark列表数据帧中的每个元素后追加一个值,python-3.x,dataframe,apache-spark,pyspark,apache-spark-sql,Python 3.x,Dataframe,Apache Spark,Pyspark,Apache Spark Sql,我有一个这样的数据帧 Data ID [1,2,3,4] 22 我想创建一个新列,新列中的每个条目都是数据字段中的值,后面加上ID by~symbol,如下所示 Data ID New_Column [1,2,3,4] 22 [1|22~2|22~3|22~4|22] 注意:在数据字段中,数组大小不是固定的。它可能没有条目,或者有N个条目。 谁能帮我解决这个

我有一个这样的数据帧

 Data           ID   

[1,2,3,4]        22    
我想创建一个新列,新列中的每个条目都是数据字段中的值,后面加上ID by~symbol,如下所示

 Data         ID               New_Column

[1,2,3,4]     22               [1|22~2|22~3|22~4|22]
注意:在数据字段中,数组大小不是固定的。它可能没有条目,或者有N个条目。 谁能帮我解决这个问题

udf可以帮助:

package spark

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._

object DF extends App {

  val spark = SparkSession.builder()
    .master("local")
    .appName("DataFrame-example")
    .getOrCreate()

  import spark.implicits._

  val df = Seq(
    (22, Seq(1,2,3,4)),
    (23, Seq(1,2,3,4,5,6,7,8)),
    (24, Seq())
  ).toDF("ID", "Data")

  val arrUDF = udf((id: Long, array: Seq[Long]) => {
    val r = array.size match {
      case 0 => ""
      case _ => array.map(x => s"$x|$id").mkString("~")
    }

    s"[$r]"
  })

  val resDF = df.withColumn("New_Column", lit(arrUDF('ID, 'Data)))

  resDF.show(false)
  //+---+------------------------+-----------------------------------------+
  //|ID |Data                    |New_Column                               |
  //+---+------------------------+-----------------------------------------+
  //|22 |[1, 2, 3, 4]            |[1|22~2|22~3|22~4|22]                    |
  //|23 |[1, 2, 3, 4, 5, 6, 7, 8]|[1|23~2|23~3|23~4|23~5|23~6|23~7|23~8|23]|
  //|24 |[]                      |[]                                       |
  //+---+------------------------+-----------------------------------------+




}
def FUNCARY,后缀: 返回“~”。为数组中的x加入[strx+'|'+strsuffix] 从pyspark.sql.types导入StringType 从pyspark.sql导入函数为F my_udf=F.udffunc,StringType df.withColumnNew_Column,my_udfData,ID.show 印刷品

+------+--+----------+ |数据| ID |新|列| +------+--+----------+ |[1, 2, 3, 4]| 22|22~1|22~2|22~3|22~4| +------+--+----------+ udf可以帮助:

def FUNCARY,后缀: 返回“~”。为数组中的x加入[strx+'|'+strsuffix] 从pyspark.sql.types导入StringType 从pyspark.sql导入函数为F my_udf=F.udffunc,StringType df.withColumnNew_Column,my_udfData,ID.show 印刷品

+------+--+----------+ |数据| ID |新|列| +------+--+----------+ |[1, 2, 3, 4]| 22|22~1|22~2|22~3|22~4| +------+--+----------+ 火花2.4+

Pyspark的等效值如下所示

df = spark.createDataFrame([(22, [1,2,3,4]),(23, [1,2,3,4,5,6,7,8]),(24, [])],['Id','Data'])

df.show()

+---+--------------------+
| Id|                Data|
+---+--------------------+
| 22|        [1, 2, 3, 4]|
| 23|[1, 2, 3, 4, 5, 6...|
| 24|                  []|
+---+--------------------+

df.withColumn('ff', f.when(f.size('Data')==0,'').otherwise(f.expr('''concat_ws('~',transform(Data, x->concat(x,'|',Id)))'''))).show(20,False)

+---+------------------------+---------------------------------------+
|Id |Data                    |ff                                     |
+---+------------------------+---------------------------------------+
|22 |[1, 2, 3, 4]            |1|22~2|22~3|22~4|22                    |
|23 |[1, 2, 3, 4, 5, 6, 7, 8]|1|23~2|23~3|23~4|23~5|23~6|23~7|23~8|23|
|24 |[]                      |                                       |
+---+------------------------+---------------------------------------+

如果希望最终输出为数组

df.带有列'ff',f.arrayf.当nf.size'Data'==0时,.otherwisef.expr'concat_ws'~',transformData,x->concatx',Id',show20,False +--+------------+---------------------+ |Id |数据| ff| +--+------------+---------------------+ |22 |[1, 2, 3, 4] |[1|22~2|22~3|22~4|22] | |23 |[1, 2, 3, 4, 5, 6, 7, 8]|[1|23~2|23~3|23~4|23~5|23~6|23~7|23~8|23]| |24 |[] |[] | +--+------------+---------------------+ 希望这有帮助

火花2.4+

Pyspark的等效值如下所示

df = spark.createDataFrame([(22, [1,2,3,4]),(23, [1,2,3,4,5,6,7,8]),(24, [])],['Id','Data'])

df.show()

+---+--------------------+
| Id|                Data|
+---+--------------------+
| 22|        [1, 2, 3, 4]|
| 23|[1, 2, 3, 4, 5, 6...|
| 24|                  []|
+---+--------------------+

df.withColumn('ff', f.when(f.size('Data')==0,'').otherwise(f.expr('''concat_ws('~',transform(Data, x->concat(x,'|',Id)))'''))).show(20,False)

+---+------------------------+---------------------------------------+
|Id |Data                    |ff                                     |
+---+------------------------+---------------------------------------+
|22 |[1, 2, 3, 4]            |1|22~2|22~3|22~4|22                    |
|23 |[1, 2, 3, 4, 5, 6, 7, 8]|1|23~2|23~3|23~4|23~5|23~6|23~7|23~8|23|
|24 |[]                      |                                       |
+---+------------------------+---------------------------------------+

如果希望最终输出为数组

df.带有列'ff',f.arrayf.当nf.size'Data'==0时,.otherwisef.expr'concat_ws'~',transformData,x->concatx',Id',show20,False +--+------------+---------------------+ |Id |数据| ff| +--+------------+---------------------+ |22 |[1, 2, 3, 4] |[1|22~2|22~3|22~4|22] | |23 |[1, 2, 3, 4, 5, 6, 7, 8]|[1|23~2|23~3|23~4|23~5|23~6|23~7|23~8|23]| |24 |[] |[] | +--+------------+---------------------+
希望这有帮助

我不明白你在找什么。您提供了一个整数数组[1,2,3,4]的输入-是否希望文本项数组作为输出?是@Frank。为什么1不加上22~?我不明白你在找什么。您提供了一个整数数组[1,2,3,4]的输入-是否希望文本项数组作为输出?是@Frank。确切地说,为什么1没有附加22~?Hello@mvasyliv,在数据字段中,数组大小不是固定的。它可能没有条目或有N个条目。Spark版本使用什么?-@T.SURESHARUNACHALAMSpark-2.4.5@mvasylivedit我对数组的回答不固定-@T.suresharunachalamshello@mvasylive,在数据字段中数组大小不固定。它可能没有条目或有N个条目。Spark版本使用什么?-@T.SURESHARUNACHALAMSpark-2.4.5@mvasylivedit我对数组的回答不是固定的-@T.SURESHARUNACHALAM