针对您的问题,我测试了一段代码。union
函数并不关心列的名称,它关注的是列的数量和类型,并将数据逐行堆叠在一起。得到一行('scala', NULL)的情况很奇怪,因为我进行了测试,如果没有在table2中已经存在这一行的话,这个操作应该能正常工作。
from pyspark.sql import SparkSession
from pyspark.sql.types import *
from pyspark.sql import Row
from pyspark.sql.functions import coalesce
spark = SparkSession.builder.appName("SparkSQL").getOrCreate()
# 创建数据样本
schema = StructType([
StructField("lang", StringType(), True),
StructField("created_date", StringType(), True)
])
rows = [Row("java", "11-01-23"), Row("python", "11-11-23")]
rows2 = [Row("scala", "11-21-23"), Row("scala", None)]
schema2 = StructType([
StructField("lang", StringType(), True),
StructField("ingested_date", StringType(), True)
])
# 创建DataFrame
df = spark.createDataFrame(rows, schema)
df2 = spark.createDataFrame(rows2, schema2)
# 使用union合并DataFrame
result = df.union(df2)
# 删除含有空值的行
result.dropna().show()
即使table1中的第二列名为created_date
,而table2中的第二列名为ingested_date
,由于union
会检查DataFrame的列数量及其每列的数据类型,所以它仍会将数据堆叠起来。
关于您提供的代码,遗憾的是无法复现问题。不过,如果您在执行union
后仍然有额外无用的行,您可以这样做:
merged_table = table1.union(table2).dropna()
对此感到好奇并愿意讨论,希望这能帮到您!