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

使用字符串数组的行字段筛选spark dataframe

仲孙铭
2023-03-14

使用Spark 1.5和Scala 2.10.6

我试图通过一个字段“tags”(字符串数组)来筛选一个数据表。查找所有具有标记“private”的行。

val report = df.select("*")
  .where(df("tags").contains("private"))

得到:

线程“main”org.apache.spark.sql.analysisException中的异常:由于数据类型不匹配,无法解析“contains(tags,private)”:参数1需要字符串类型,但“tags”是数组类型;

  def testData (sc: SparkContext): DataFrame = {
    val stringRDD = sc.parallelize(Seq("""
      { "name": "ed",
        "tags": ["red", "private"]
      }""",
      """{ "name": "fred",
        "tags": ["public", "blue"]
      }""")
    )
    val sqlContext = new org.apache.spark.sql.SQLContext(sc)
    import sqlContext.implicits._
    sqlContext.read.json(stringRDD)
  }
  def run(sc: SparkContext) {
    val df1 = testData(sc)
    df1.show()
    val report = df1.select("*")
      .where(df1("tags").contains("private"))
    report.show()
  }

更新:标签数组可以是任意长度,“private”标签可以在任意位置

更新:一个有效的解决方案:UDF

val filterPriv = udf {(tags: mutable.WrappedArray[String]) => tags.contains("private")}
val report = df1.filter(filterPriv(df1("tags")))

共有1个答案

巩光誉
2023-03-14

我认为如果您使用where(array_contains(...)),它就会起作用。以下是我的结果:

scala> import org.apache.spark.SparkContext
import org.apache.spark.SparkContext

scala> import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.DataFrame

scala> def testData (sc: SparkContext): DataFrame = {
     |     val stringRDD = sc.parallelize(Seq
     |      ("""{ "name": "ned", "tags": ["blue", "big", "private"] }""",
     |       """{ "name": "albert", "tags": ["private", "lumpy"] }""",
     |       """{ "name": "zed", "tags": ["big", "private", "square"] }""",
     |       """{ "name": "jed", "tags": ["green", "small", "round"] }""",
     |       """{ "name": "ed", "tags": ["red", "private"] }""",
     |       """{ "name": "fred", "tags": ["public", "blue"] }"""))
     |     val sqlContext = new org.apache.spark.sql.SQLContext(sc)
     |     import sqlContext.implicits._
     |     sqlContext.read.json(stringRDD)
     |   }
testData: (sc: org.apache.spark.SparkContext)org.apache.spark.sql.DataFrame

scala>   
     | val df = testData (sc)
df: org.apache.spark.sql.DataFrame = [name: string, tags: array<string>]

scala> val report = df.select ("*").where (array_contains (df("tags"), "private"))
report: org.apache.spark.sql.DataFrame = [name: string, tags: array<string>]

scala> report.show
+------+--------------------+
|  name|                tags|
+------+--------------------+
|   ned|[blue, big, private]|
|albert|    [private, lumpy]|
|   zed|[big, private, sq...|
|    ed|      [red, private]|
+------+--------------------+

注意,如果您编写where(array_contains(df(“标签”),“private”)),它可以工作,但是如果您编写where(df(“标签”).array_contains("private“))(更直接地类似于您最初编写的内容),它将失败,因为array_contains不是org.apache.spark.sql.column的成员。查看的源代码,我看到有一些东西要处理contains(为此构造contains实例),但不是array_contains。也许那是疏忽。

 类似资料:
  • 我有一个返回字符串[][]的方法,如下所示: 我做错了什么?

  • 我想从包含单词Evil(filterString)的数组中删除一些元素。 以下是我从原始阵列(来宾)获得的信息: 只希望客人数组更新一旦所需的字符串(邪恶)被过滤。

  • 我试图使用python客户端应用筛选弹性搜索索引数据,但它不能处理字符串字段。 这是我的ES索引数据: [{u“_score”:1.0,u“_type”:u“ip”,u“_id”:u“79”,u“_source”:{u“status”:u“published”,u“username”:u“jackie@example.com”,u“id”:79},u“_index”:u“idx_object”},

  • 本文向大家介绍MySQL查询以字符串字段中的数字字符对行进行分组?,包括了MySQL查询以字符串字段中的数字字符对行进行分组?的使用技巧和注意事项,需要的朋友参考一下 为此,您可以在+运算符的帮助下将0与字符串字段连接起来。这里的场景就像我们需要从字符串字段“ 9844Bob ”中获取数字“ 9844 ”。 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所

  • 问题内容: 在执行过程中,您将json解组为结构。问题是我有一个api,可能会在请求之间更改键值的类型。 例如,可能是内联对象的对象如下: 而且还可以通过键指向对象,如下所示: 可以内联某些对象,但是可以从多个位置引用其他对象。 在javascript或python中这不是问题。只需检查类型。 解组和解析这两个对象的惯用方式是什么?是反映的唯一方法吗? 问题答案: 您可以将此JSON解组为如下结构

  • 我有一个文档索引。我想过滤公共文档或由我的组成员(用户1和3)共享给组的文档。 隐私="公共"或(1,3)中的隐私="组"和user_id) 我可以分开做,但是如何将它们与OR结合起来? 文件: {“id”:1,“user_id”:1, “隐私”:“公共”,“标题”:“为一个人做饭”,} {“id”:3,“user_id”:1, “隐私”:“组”,“标题”:“三的公司”} {“id”:4,“use