使用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")))
我认为如果您使用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