当前位置: 首页 > 知识库问答 >
问题:

使用where或filter语句在pyspark中运行子查询

祁英哲
2023-03-14

我正在尝试在pyspark中运行子查询。我发现可以使用SQL语句。但是,使用“where”或“filter”操作是否有任何内在的支持?

考虑测试数据框架:

from pyspark.sql import SparkSession
sqlContext = SparkSession.builder.appName('test').enableHiveSupport().getOrCreate() 
tst = sqlContext.createDataFrame([(1,2),(4,3),(1,4),(1,5),(1,6)],schema=['sample','time'])
tst_sub = sqlContext.createDataFrame([(1,2),(4,3),(1,4)],schema=['sample','time'])
#%% using where to query the df
tst.where(F.col('time')>4).show()
+------+----+
|sample|time|
+------+----+
|     1|   5|
|     1|   6|
+------+----+

在这里,您可以看到where函数工作正常。当我尝试使用子查询执行相同操作时,如下所示:

#%% using where with subquery
tst.where(F.col('time')>F.max(tst_sub.select('time'))).show()

我得到这个错误:

属性错误回溯(最近一次调用)在----

/opt/cloudera/parcels/CDH-6.3.4-1。cdh6.3.4。p4744.12781922/lib/spark/python/pyspark/sql/functions。py in(col)42 def(col):43 sc=SparkContext_active\u spark\u上下文---

/opt/cloudera/parcels/CDH-6.3.4-1。cdh6.3.4。p4744.12781922/lib/spark/python/lib/py4j-0.10.7-src。zip/py4j/java\u网关。py in call(self,*args)1246 1247 def call(self,*args):-

/opt/cloudera/parcels/CDH-6.3.4-1。cdh6.3.4。p4744.12781922/lib/spark/python/lib/py4j-0.10.7-src。zip/py4j/java\u网关。py in \u build\u args(self,*args)1216 1217 args\u命令=“”。加入(-

/opt/cloudera/parcels/CDH-6.3.4-1。cdh6.3.4。p4744.12781922/lib/spark/python/lib/py4j-0.10.7-src。zip/py4j/java\u网关。py in(.0)1216 1217 args\u命令=“”。加入(-

/opt/cloudera/parcels/CDH-6.3.4-1。cdh6.3.4。p4744.12781922/lib/spark/python/lib/py4j-0.10.7-src。zip/py4j/协议。py in get\u command\u part(参数,python\u proxy\u pool)296 command\u part=“;”接口297其他:--

/opt/cloudera/parcels/CDH-6.3.4-1.cdh6.3.4. p4744.12781922 /lib/spark/python/pyspark/sql/dataframe.py在getattr(自己,名称)1298如果名称不在self.columns: 1299引发属性错误(-

属性错误:'DataFrame'对象没有属性'_get_object_id'

当我将数据帧注册为表并执行sql查询时,它工作正常:

tst.createOrReplaceTempView("tst")
tst_sub.createOrReplaceTempView("tst_sub")
sqlContext.sql("SELECT * FROM tst WHERE time>(SELECT(max(time)) FROM tst_sub)").show()

是否有任何方法可以直接使用filter、where或任何其他方法在pyspark中对数据帧执行子查询?

共有1个答案

能逸清
2023-03-14

在将最大时间放入过滤器之前,需要将其收集到Python中的数字变量中:

tst.where(F.col('time') > tst_sub.select(F.max('time')).head()[0]).show()
+------+----+
|sample|time|
+------+----+
|     1|   5|
|     1|   6|
+------+----+
 类似资料:
  • 问题内容: 在WHERE子句中有使用SELECT语句描述的名称吗?这是好/不好的做法吗? 这会是更好的选择吗? 它远没有那么优雅,但是运行起来比以前的版本要快。我不喜欢它,因为它在GUI中没有非常清晰地显示(并且SQL初学者需要理解它)。我可以将其分为两个独立的查询,但是随后事情变得混乱了…… 注意:我不仅需要日期和分数(例如姓名) 问题答案: 称为相关子查询。它有它的用途。

  • 如何将行号用作where子句的一部分? 我有,假设,25个数据,我只想得到前10行或得到从11到20的行。 如何使用行号?我无法执行下面的查询 更新:问题是,在我的where子句中,row_number在表UPDATE2:Thanks Guys中是未知的!不管怎样,我找到了这个。选择行号=行号的位置

  • 问题内容: 在命名查询的where子句中可能有一个like?我正在尝试执行以下操作,但出现异常 我尝试像在普通SQL中那样添加%,但是得到了异常编译。 任何指针,不胜感激! 谢谢 问题答案: 您不能在中添加%,但可以在为其分配参数的值中包含它。 如:

  • 问题内容: 谁能给我一些关于如何将这种子查询放入提示?(我正在使用 JPA 2.0 - Hibernate 4.x ) -第二个选择将始终获得单个结果或null。 问题答案: 尝试类似以下示例的操作来创建子查询: 请注意,由于附近缺少IDE,因此该代码尚未经过测试。

  • 问题内容: 我有一个简单的选择查询- 我希望此结果按提供名称的顺序排序,也就是说,结果集中的第一行应该是名称= BBB的那一行,第二行是AAA,第三行是ZZZ。 在SQL Server中这可能吗?我想知道如果有一种简单且简短的方法(例如大约5到6行代码)来做到这一点。 问题答案: 您可以创建一个有序的拆分函数: 然后略微更改您的输入(一个逗号分隔的列表,而不是三个单独的字符串):

  • 问题内容: 这对我来说是一个常见的SQL查询: 有什么办法可以避免拥有两个几乎相同的子查询?该查询是一个明显的简化,但是性能会受到影响,并且查询的内容不必要地凌乱。 问题答案: 不幸的是,Informix不支持UPDATE语句中的FROM子句。解决方法,您将获得更好的结果(性能),方法是将UPDATE更改为MERGE语句。 仅当您的数据库为11.50或更高版本时,此方法才有效 查看IBM Info