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