【问题标题】:Hive SQL left join based on substring search from a second tableHive SQL 左连接基于来自第二个表的子字符串搜索
【发布时间】:2021-12-03 21:50:52
【问题描述】:

我需要创建一个表格,将查询与我们在内容中定位的一组关键字连接起来。 Google 搜索表是对博客的搜索查询和印象,关键字表是内部创建的关键字表和我们分配给它们的值 (1-10)。我需要加入这两个才能获得基于关键字的展示次数。

类似于这个伪代码的东西

   select a.*, b.* 
     from google_search_table a
left join Keyword_Table b
       on contains(a.query, b.keyword)

谷歌搜索表

Query Impressions
Most minty toothpaste 8274
best bath soap 4375
How to cook tomatoes 1734
top softest toilet paper 892
top bushcraft skills 9284

关键词表

Keyword value
toothpaste 2
soap 5
tomatoes 3
toilet paper 3

预期结果表

Keyword Impressions
toothpaste 8274
soap 4375
tomatoes 1734
toilet paper 892
null 9284

【问题讨论】:

    标签: sql hadoop hive hql


    【解决方案1】:

    这是解决问题的 SQL。

    SELECT * 
    from ( select Keyword, Impressions
    from google_search_table
    lateral view explode(split(Query,' ')) t1 as Keyword ) a
    where 
      a.Keyword is in (select Keyword from Keyword_Table)
    

    如果性能合理,那就好好利用它。我假设关键字表很小。

    如果它破坏了内存堆栈,您可能需要查看某种类型的广播连接或映射侧连接。

    【讨论】:

    • 这很好,但不适用于 2 字关键字(可能应该称为关键短语)。例如,“卫生纸”,关键字表的第 4 行。它将所有查询拆分为每行只有 1 个单词的行。还是我错过了什么?
    • 您完全正确,它不适用于“关键短语”仅关键字。 (我完全错过了您包含的非常清晰的 2 字示例)您可能需要使用 spark 函数/hive UDF 以干净的方式执行“包含”。 UDF 的性能不是最好的,但他们会完成工作。 Spark 可能是最简单的编写方法来解决创建 Java 类作为 UDF 的问题。
    【解决方案2】:

    我建议尝试 pyspark/spark

    resultTable = google_search_table.join(Keyword_Table, google_search_table.Query.contains(Keyword_Table.Keyword), how='left')
    

    您可以查看其他人如何解决similar issue using pyspark here

    【讨论】:

    • 嗯。这对我来说是新的。我会试一试。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 2016-11-22
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多