Join 为什么在pyspark中连接两个临时视图后删除列是';t工作,但哪一个工作与数据帧连接?
我需要用数据帧创建临时视图,然后我需要连接这些临时视图并删除重复的列。因此,我编写了如下所述的代码:Join 为什么在pyspark中连接两个临时视图后删除列是';t工作,但哪一个工作与数据帧连接?,join,pyspark,view,apache-spark-sql,drop,Join,Pyspark,View,Apache Spark Sql,Drop,我需要用数据帧创建临时视图,然后我需要连接这些临时视图并删除重复的列。因此,我编写了如下所述的代码: Data1 = [ ("xx1",34,60), ("xx2",33,80), ("xx3",37,50) ] dataSchema1 = StructType([ StructField("Name",StringType(),True), Stru
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']
有谁能帮助我理解从联合临时视图中删除列的第一种方法有什么问题吗?
drop
从数据集中删除列名
或列
本身。如果架构不包含列名
,则这是无操作
操作
drop
内部使用analyzer.resolver
检查数据帧中是否存在提供的字符串请注意,如果提供相同的spark,则无法提供在drop中引用列的类似sql的语法,因为spark将假定整个字符串作为列名
选择expr(“…”)
和函数。expr(“…”
在内部使用会话状态.sqlParser
解析引用列的类似sql的语法,如
如果希望使用类似sql的语法,请尝试将相同的函数与expr
一起使用-
rjDF=jDF.drop(F.expr('view2.Id'))
否则,您可以基于下拉-
dropped=joinDF.drop(df2.Id)
>rjDF=jDF.drop(F.expr('view2.Id'))这解决了我的问题。非常感谢!