java - Spark Sql,无法查询数组中的多个可能值

标签 java apache-spark apache-spark-sql document-database bigdata

我有 LinkeIn 帐户的数据架构,如下所示。我需要查询数组的 for 中的技能,其中数组可能包含 JAVA OR java OR Java 或 JAVA developer OR Java developer。

Linkedin dataschema

Dataset<Row> sqlDF = spark.sql("SELECT * FROM people"
            + " WHERE ARRAY_CONTAINS(skills,'Java') "
            + " OR ARRAY_CONTAINS(skills,'JAVA')"
            + " OR ARRAY_CONTAINS(skills,'Java developer') "
            + "AND ARRAY_CONTAINS(experience['description'],'Java developer')"  );

上面的查询是我试过的,请提出更好的方法。以及如何使用不区分大小写的查询?

最佳答案

df.printschema()

root
 |-- skills: array (nullable = true)
 |    |-- element: string (containsNull = true)


df.show()

+--------------------+
|              skills|
+--------------------+
|        [Java, java]|
|[Java Developer, ...|
|               [dev]|
+--------------------+

现在让我们将其注册为临时表:

>>> df.registerTempTable("t")

现在,我们将分解数组,将每个元素转换为小写并使用 LIKE 运算符查询:

>>> res = sqlContext.sql("select skills, lower(skill) as skill from (select skills, explode(skills) skill from t) a where lower(skill) like '%java%'")
>>> res.show()
+--------------------+--------------+
|              skills|         skill|
+--------------------+--------------+
|        [Java, java]|          java|
|        [Java, java]|          java|
|[Java Developer, ...|java developer|
|[Java Developer, ...|      java dev|
+--------------------+--------------+

现在,您可以在技能领域做一个独特的。

关于java - Spark Sql,无法查询数组中的多个可能值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39565670/

相关文章:

java - 我无法在 fragment 中显示 map

apache-spark - 适用于 1000 多个主题的 Spark Streaming 设计

java - 比较 RDD 对象 - Apache Spark

scala - 在 Spark Catalyst 中从一个逻辑计划转换为另一个逻辑计划

Java:简单的字符串到日期解析失败并出现异常

java - 并发应用程序不如单线程快

java - 开发 Penlet 的技巧

python - 在pySpark中处理空数组(可选的二进制元素(UTF8)不是一个组)

postgresql - Spark Dataframes UPSERT 到 Postgres 表

apache-spark - Spark SubQuery 扫描整个分区