如何从 pyspark sql 上的大表中选择除其中 2 列之外的所有列?

问题描述 投票:0回答:4

在连接两个表时,我想从 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 如何选择除一列之外的所有列?

但是,它对我不起作用。所有列都在结果中。 我想删除重复的列(结果中的年份和月份)。

谢谢

python sql apache-spark pyspark hive
4个回答
11
投票

从 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...

4
投票

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|
#+---+---+

3
投票

在pyspark中,你可以做这样的事情:

df.select([col for col in df.columns if c not in {'col1', 'col2', 'col3'}])

其中 df 是执行连接操作后生成的数据帧。


0
投票

pyspark中另一种简单的方法:

df.selectExpr("* except(column1,column2)")

© www.soinside.com 2019 - 2024. All rights reserved.