0

我需要从数据帧中创建 tempViews,然后我需要加入这些 tempviews 并删除重复的列。因此,我编写了如下所述的代码:

 Data1 = [  ("xx1",34,60),
           ("xx2",33,80),
           ("xx3",37,50) ]

dataSchema1 = StructType([
    StructField("Name",StringType(),True),
    StructField("Age",IntegerType(),True),
    StructField("Id",IntegerType(),True)
   ])

Data2 = [  (60,"M",3000.60),
           (80,"F",3300.80),
           (50,"M",5000.50) ]

dataSchema2 = StructType([
    StructField("Id",IntegerType(),True),
    StructField("Gender", StringType(), True),
    StructField("Salary", DoubleType(), True)
  ])

df1 = spark.createDataFrame(spark.sparkContext.parallelize(Data1),schema=dataSchema1)
df1.createOrReplaceTempView('view1')

df2 = spark.createDataFrame(spark.sparkContext.parallelize(Data2),schema=dataSchema2)
df2.createOrReplaceTempView('view2')

jDF=spark.sql("select * from view1 join view2 on view1.Id = view2.Id")
jDF.columns                 // ['Name', 'Age', 'Id', 'Id', 'Gender', 'Salary']
rjDF=jDF.drop('view2.ID')    //this function is not working
rjDF.columns                // ['Name', 'Age', 'Id', 'Id', 'Gender', 'Salary']

在上面的代码中,drop column 方法没有按预期工作,也没有抛出任何错误。但是,如果我尝试使用数据框删除列(在我的用例中这显然不是我的首选),那么 drop 方法可以正常工作。

joinDF=df1.join(df2, df1.Id == df2.Id)
dropped=joinDF.drop(df2.Id)    // working absolutely fine
dropped.columns               // ['Name', 'Age', 'Id', 'Gender', 'Salary']

谁能帮助我理解从加入的临时视图中删除列的第一种方法有什么问题?

4

1 回答 1

1

drop从数据集取column namescolumn本身丢弃。no-op如果架构不包含,这是操作column name(s)

drop内部用于analyzer.resolver检查提供的字符串是否存在于数据框中。请注意,您不能在 drop 中提供引用列的类似 sql 的语法如果您提供相同的 spark 将假定整个字符串作为列名。

selectExpr("..")并在functions.expr("..")内部用于sessionState.sqlParser解析引用列的类似 sql 的语法,例如<table/view name>.<column_name>.

expr如果您想使用类似 sql 的语法,请尝试使用相同的函数 -

rjDF=jDF.drop(F.expr('view2.Id'))

否则,您可以使用基于您的工作列drop-

dropped=joinDF.drop(df2.Id)
于 2020-08-01T15:36:30.113 回答