Dataframe 将数据帧中的列与空值串联

Dataframe 将数据帧中的列与空值串联,dataframe,pyspark,apache-spark-sql,concatenation,Dataframe,Pyspark,Apache Spark Sql,Concatenation,代码: 实际结果: 将删除具有空值的列。 我希望输出如Name3所示(预期为Columnt) 我认为,问题发生在加入表格之后 名称列在df2和df3中可用。 在加入之前,它们不包含空值 问题: 加入后;因为pyspark不删除公共列,所以我们有两个表中的name1列 我试着用空字符串来回复它;它不起作用,并抛出错误 如何在连接表后用空字符串替换空值 .withColumn("Name3",F.concat(F.trim(Name1), F.trim(Name2))) 试试这个- 它应该在pyt

代码:

实际结果: 将删除具有空值的列。 我希望输出如Name3所示(预期为Columnt)

我认为,问题发生在加入表格之后 名称列在df2和df3中可用。 在加入之前,它们不包含空值

问题: 加入后;因为pyspark不删除公共列,所以我们有两个表中的name1列 我试着用空字符串来回复它;它不起作用,并抛出错误

如何在连接表后用空字符串替换空值

.withColumn("Name3",F.concat(F.trim(Name1), F.trim(Name2)))
试试这个-

它应该在python中实现,改动最小

val数据=
"""
|名称1 |名称2
|RR工业|
|RR工业| RR工业
“.stripMargin”
val stringDS=data.split(System.lineSeparator())
.map(\\\\\).map(\.replaceAll(“^[\t]+\\t]+$”,“).mkString(“,”)
.toSeq.toDS()
val df=spark.read
.期权(“sep”、“、”)
.选项(“推断模式”、“真”)
.选项(“标题”、“正确”)
.csv(stringDS)
df.show(假)
df.printSchema()
/**
* +-------------+-------------+
*|名称1 |名称2|
* +-------------+-------------+
*| RR Industries |空|
*| RR工业| RR工业|
* +-------------+-------------+
*
*根
*|--Name1:string(nullable=true)
*|--Name2:string(nullable=true)
*/
df.withColumn(“Name3(预期)”,concat_ws(“”,df.columns.map(col.map)(c=>coalesce(c,lit(“”)):)
.show(假)
/**
* +-------------+-------------+--------------------------+
*|名称1 |名称2 |名称3(预期)|
* +-------------+-------------+--------------------------+
*| RR Industries | null | RR Industries|
*| RR Industries | RR Industries | RR Industries RR Industries|
* +-------------+-------------+--------------------------+
*/
df.withColumn(“Name3(预期)”,concat_ws(“”,df.columns.map(col):*)
.show(假)
/**
* +-------------+-------------+--------------------------+
*|名称1 |名称2 |名称3(预期)|
* +-------------+-------------+--------------------------+
*| RR Industries | null | RR Industries|
*| RR Industries | RR Industries | RR Industries RR Industries|
* +-------------+-------------+--------------------------+
*/

您可以在pyspark中尝试这种方法

df = df1\
.join(df2,"code",how = 'left') \
.join(df3,"id",how = 'left')\
.join(df4,"id",how = 'left')\
.withColumn('name1',F.when(df2('name1').isNull(),'').otherwise(df2('name1')))\
.withColumn('name1',F.when(df3('name1').isNull(),'').otherwise(df3('name1')))\
.withColumn("Name1",F.concat(F.trim(df2.name1), F.trim(df3.name1)))

如果concat语句中的任何列为null,则concat的结果为null,这就是它的工作方式。使用
coalesce
将空值替换为空字符串,并将其用于您的concat.df.fillna不起作用…我可以使用trydf=df.withColumn('name2',F.when(F.col('name2').isNull(),'')的任何其他示例。否则(F.col('name2'))也不起作用。我需要下载任何库来进行映射吗?我正在使用pyspark和.map(col):不需要下载任何库。我正在将所有列名转换为列。这里的
col
表示
函数。col
df = df1\
.join(df2,"code",how = 'left') \
.join(df3,"id",how = 'left')\
.join(df4,"id",how = 'left')\
.withColumn('name1',F.when(df2('name1').isNull(),'').otherwise(df2('name1')))\
.withColumn('name1',F.when(df3('name1').isNull(),'').otherwise(df3('name1')))\
.withColumn("Name1",F.concat(F.trim(df2.name1), F.trim(df3.name1)))
from pyspark.sql import SparkSession
from pyspark.sql import functions as F

spark = SparkSession.builder \
.appName('practice')\
.getOrCreate()

sc= spark.sparkContext

df = sc.parallelize([
("RR Industries",None), ("RR Industries", "RR Industries")]).toDF(["Name1", 
  "Name2"])


 df.withColumn("Name3", F.concat_ws("", F.col("Name1"), 
 F.col("Name2"))).show(truncate=False)

+-------------+-------------+--------------------------+
|Name1        |Name2        |Name3                     |
+-------------+-------------+--------------------------+
|RR Industries|null         |RR Industries             |
|RR Industries|RR Industries|RR IndustriesRR Industries|
+-------------+-------------+--------------------------+