Spark多表关联嵌套结构中id3重复异常排查求助
Spark DataFrame重复数据异常排查
多次表关联得到Spark DataFrame,从业务逻辑判断不应存在重复数据,但检测时发现异常:仅基于id3检测到重复(如id3=8_3出现两次),但结合id4、id5分组查询时无重复记录。
复现代码
from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, IntegerType, StringType import pyspark.sql.functions as f from pyspark.sql.functions import lit # Create a Spark session spark = SparkSession.builder.appName("CreateDataFrame").getOrCreate() # User input for number of rows n_a = 10 n_a_c = 5 n_a_c_d = 3 n_a_c_e = 4 # Define the schema for the DataFrame schema_a = StructType([StructField("id1", StringType(), True)]) schema_a_b = StructType( [ StructField("id1", StringType(), True), StructField("id2", StringType(), True), StructField("extra", StringType(), True), ] ) schema_a_c = StructType( [ StructField("id1", StringType(), True), StructField("id3", StringType(), True), ] ) schema_a_c_d = StructType( [ StructField("id3", StringType(), True), StructField("id4", StringType(), True), ] ) schema_a_c_e = StructType( [ StructField("id3", StringType(), True), StructField("id5", StringType(), True), ] ) # Create a list of rows with increasing integer values for "id1" and a constant value of "1" for "id2" rows_a = [(str(i),) for i in range(1, n_a + 1)] rows_a_integers = [str(i) for i in range(1, n_a + 1)] rows_a_b = [(str(i), str(1), "A") for i in range(1, n_a + 1)] def get_2d_list(ids_part_1: list, n_new_ids: int): rows = [ [ (str(i), str(i) + "_" + str(j)) for i in ids_part_1 for j in range(1, n_new_ids + 1) ] ] return [item for sublist in rows for item in sublist] rows_a_c = get_2d_list(ids_part_1=rows_a_integers, n_new_ids=n_a_c) rows_a_c_d = get_2d_list(ids_part_1=[i[1] for i in rows_a_c], n_new_ids=n_a_c_d) rows_a_c_e = get_2d_list(ids_part_1=[i[1] for i in rows_a_c], n_new_ids=n_a_c_e) # Create the DataFrame df_a = spark.createDataFrame(rows_a, schema_a) df_a_b = spark.createDataFrame(rows_a_b, schema_a_b) df_a_c = spark.createDataFrame(rows_a_c, schema_a_c) df_a_c_d = spark.createDataFrame(rows_a_c_d, schema_a_c_d) df_a_c_e = spark.createDataFrame(rows_a_c_e, schema_a_c_e) # Join everything df_join = ( df_a.join(df_a_b, on="id1") .join(df_a_c, on="id1") .join(df_a_c_d, on="id3") .join(df_a_c_e, on="id3") ) # Nested structure # show df_nested = df_join.withColumn("id3", f.struct(f.col("id3"))).orderBy("id3") for i, index in enumerate([(5, 3), (4, 3), (3, None)]): remaining_columns = list(set(df_nested.columns).difference(set([f"id{index[0]}"]))) df_nested = ( df_nested.groupby(*remaining_columns) .agg(f.collect_list(f.col(f"id{index[0]}")).alias(f"id{index[0]}_tmp")) .drop(f"id{index[0]}") .withColumnRenamed( f"id{index[0]}_tmp", f"id{index[0]}", ) ) if index[1]: df_nested = df_nested.withColumn( f"id{index[1]}", f.struct( f.col(f"id{index[1]}.*"), f.col(f"id{index[0]}"), ).alias(f"id{index[1]}"), ).drop(f"id{index[0]}")
重复检测代码及结果
仅基于id3检测重复
# Investigate for duplicates df_test = df_nested.select("id2", "extra", f.explode(f.col("id3")["id3"]).alias("id3")) df_test.groupby("id3").count().filter(f.col("count") > 1).show()
结果:
+---+-----+ |id3|count| +---+-----+ |8_3| 2| +---+-----+
结合id3、id4、id5检测重复
df_join.groupby("id3", "id4", "id5").count().filter(f.col("count") > 1).show()
结果:
+---+---+---+-----+ |id3|id4|id5|count| +---+---+---+-----+ +---+---+---+-----+
环境信息
使用Databricks Runtime Version 11.3 LTS(包含Apache Spark 3.3.0、Scala 2.12),请求协助排查该异常原因。
内容的提问来源于stack exchange,提问作者Lazloo Xp
相关产品推荐
相关产品推荐

