当前位置: 首页 > 面试题库 >

使用类似SQL的IN子句过滤Pyspark DataFrame

越健
2023-03-14
问题内容

我想用类似SQL的IN子句过滤Pyspark DataFrame ,如

sc = SparkContext()
sqlc = SQLContext(sc)
df = sqlc.sql('SELECT * from my_df WHERE field1 IN a')

a元组在哪儿(1, 2, 3)?我收到此错误:

java.lang.RuntimeException:[1.67]错误:预期“(”,但找到了标识符

这基本上是说它期待的是 ‘(1,2,3)’ 而不是a。问题是由于从另一个作业中提取了值,因此我无法手动将其写入。

在这种情况下,我该如何过滤?


问题答案:

您传递给SQLContext它的字符串是在SQL环境范围内评估的。它没有捕获闭包。如果要传递变量,则必须使用字符串格式显式地进行操作:

df = sc.parallelize([(1, "foo"), (2, "x"), (3, "bar")]).toDF(("k", "v"))
df.registerTempTable("df")
sqlContext.sql("SELECT * FROM df WHERE v IN {0}".format(("foo", "bar"))).count()
##  2

显然,出于安全考虑,这不是您在“实际” SQL环境中要使用的东西,但在这里并不重要。

在实践中,DataFrame当您要创建动态查询时,DSL是很多选择:

from pyspark.sql.functions import col

df.where(col("v").isin({"foo", "bar"})).count()
## 2

它很容易为您构建,组成和处理HiveQL / Spark SQL的所有细节。



 类似资料:
  • 我有一个sql语句如下,想将其转换为JPA 输入参数 userIdList-与大小为[1100]的user\u id完全匹配的字符串列表 nameList-一个字符串列表,用于在字符[a-Za-z0-9-\u2]中精确匹配大小为[1100]的first\u name或last\u name 姓名列表示例:[“Joe”、“Peter”、“White”、“X Y”] 我不知道如何处理相似部分的列表,最

  • 本文向大家介绍SQL 使用HAVING子句过滤GROUP BY结果,包括了SQL 使用HAVING子句过滤GROUP BY结果的使用技巧和注意事项,需要的朋友参考一下 示例 HAVING子句过滤GROUP BY表达式的结果。注意:以下示例使用的是Library示例数据库。 例子: 返回写了不止一本书的所有作者(在线示例)。 返回作者超过三名的所有书籍(实时示例)。            

  • 问:在GoogleSheets中,仅使用内置函数,如何编写一个过滤器,根据每行中的一列不在另一个范围的有效值列表中排除记录。 详细资料 我正在使用Google Sheets编写一个财务电子表格,其中我所有的支出和收入都输入到一个名为“交易”的表格中。我有一个单独的表叫做常量,在这里我有一个收入类别列表和一个费用类别列表。 以下是一些用于问题的示例数据: 常数 交易 我有一张名为ByMonth的表格

  • IN 子句 标识出外部数据库中的表,例如dBASE或Paradox数据库,或Microsoft Jet外部数据库,Microsoft Jet数据库引擎能够与之相连。 语法 标识目标表: [SELECT | INSERT] INTO destination IN {path | ["path" "type"] | ["" [type; DATABASE = path]]} 标识数据源表: FROM

  • 如何使用hibernateTemplate执行批量更新操作。下面的代码抛出 原因:org。冬眠QueryParameterException:位置超出已声明序数参数的数量。请记住,序数参数是基于1的!职位:2 如何通过将用户列表作为参数传递来实现此批量更新操作???

  • 问题内容: 我该如何对包含一个IN带有可变数量的参数的子句的查询进行参数化(例如这样的查询)? 在此查询中,参数的数量可以在1到5之间的任何位置。 我不希望对此(或XML)使用专用的存储过程,但是如果有一些特定于SQL Server 2008的优雅方法,我可以接受。 问题答案: 这是我使用的一种quick-and-dirty的技术: 因此,这是C#代码: 两个警告: 表现很糟糕。LIKE “%…%