为什么在 pyspark 中加入两个临时视图后删除列不起作用,但它适用于数据框连接?
Why dropping columns after joining two temp views in pyspark isn't working, which however works with data frame joins?
我需要从数据帧中创建临时视图,然后我需要加入这些临时视图并删除重复的列。所以我写了下面提到的代码:
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
需要 column names
或 column
本身才能删除。如果架构不包含 column name(s)
.
,则这是 no-op
操作
drop
在内部使用 analyzer.resolver
检查提供的字符串是否存在于数据框中。 请注意,您不能在 drop 中提供类似 sql 的引用列的语法 如果您提供相同的 spark 将假定整个字符串作为列名称。
selectExpr("..")
和 functions.expr("..")
内部使用 sessionState.sqlParser
来解析 sql 类似于引用列的语法,如 <table/view name>.<column_name>
.
如果您想使用 sql 语法,请尝试使用与 expr
函数相同的语法-
rjDF=jDF.drop(F.expr('view2.Id'))
否则您可以使用基于 drop
-
的工作列
dropped=joinDF.drop(df2.Id)
我需要从数据帧中创建临时视图,然后我需要加入这些临时视图并删除重复的列。所以我写了下面提到的代码:
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
需要 column names
或 column
本身才能删除。如果架构不包含 column name(s)
.
no-op
操作
drop
在内部使用 analyzer.resolver
检查提供的字符串是否存在于数据框中。 请注意,您不能在 drop 中提供类似 sql 的引用列的语法 如果您提供相同的 spark 将假定整个字符串作为列名称。
selectExpr("..")
和 functions.expr("..")
内部使用 sessionState.sqlParser
来解析 sql 类似于引用列的语法,如 <table/view name>.<column_name>
.
如果您想使用 sql 语法,请尝试使用与 expr
函数相同的语法-
rjDF=jDF.drop(F.expr('view2.Id'))
否则您可以使用基于 drop
-
dropped=joinDF.drop(df2.Id)