在连接两个表时,我想从 databricks 上的 pyspark sql 上包含许多列的大表中选择除其中 2 之外的所有列。
我的 pyspark sql:
%sql
set hive.support.quoted.identifiers=none;
select a.*, '?!(b.year|b.month)$).+'
from MY_TABLE_A as a
left join
MY_TABLE_B as b
on a.year = b.year and a.month = b.month
我关注了 hive:选择所有列排除两个 Hive 如何选择除一列之外的所有列?
但是,它对我不起作用。所有列都在结果中。 我想删除重复的列(结果中的年份和月份)。
谢谢
从 Databricks Runtime 9.0 开始,您可以使用
* except()
命令,如下所示:
df = spark.sql("select a.* except(col1, col2, col3) from my_table_a...")
或者如果只是像您的示例中那样使用 %sql
select a.* except(col1, col2, col3) from my_table_a...
set hive.support.quoted.identifiers=none
Spark不支持。
而是在 Spark
set spark.sql.parser.quotedRegexColumnNames=true
中
获得与 hive 相同的行为。
Example:
df=spark.createDataFrame([(1,2,3,4)],['id','a','b','c'])
df.createOrReplaceTempView("tmp")
spark.sql("SET spark.sql.parser.quotedRegexColumnNames=true")
#select all columns except a,b
sql("select `(a|b)?+.+` from tmp").show()
#+---+---+
#| id| c|
#+---+---+
#| 1| 4|
#+---+---+
在pyspark中,你可以做这样的事情:
df.select([col for col in df.columns if c not in {'col1', 'col2', 'col3'}])
其中 df 是执行连接操作后生成的数据帧。
pyspark中另一种简单的方法:
df.selectExpr("* except(column1,column2)")