【问题标题】:How do I generate a random number _only once_ for a Hive query?如何为 Hive 查询生成随机数_only once_?
【发布时间】:2018-09-27 14:15:38
【问题描述】:

我的代码如下所示:

set hivevar:foo=rand();
select ${hivevar:foo} from my_database.my_table;

我认为,即使使用变量替换,rand() 仍会在每个 中调用一次。我如何在每个查询中将foo 设置为一个随机数?

我可以想到其他解决方案,但我想将所有内容都包含在一个配置单元查询中,而不是将更丑陋的东西拼凑在一起。

【问题讨论】:

    标签: hive


    【解决方案1】:

    此代码为每一行调用 rand():

    INSERT INTO dest_table
    SELECT st.col1, st.col2, RAND() AS col3
    FROM source_table st;
    

    这段代码只调用了一次 rand():

    WITH rand AS (
      SELECT RAND() as col3
    )
    INSERT INTO dest_table
    SELECT st.col1, st.col2, rand.col3
    FROM rand, source_table st;
    

    【讨论】:

      【解决方案2】:

      在单行子查询中调用它并与您的查询交叉连接。子查询应该执行一次

      select s.rnd, a.col, etc
        from my_database.my_table a
            cross join
        (select rand() as rnd) s
      ;
      

      【讨论】:

      • 太棒了。这帮助我理解了正在发生的事情以及我真正想做的事情:在标量和向量之间进行笛卡尔积,就像交叉连接所做的那样。谢谢!但是,我想我将使用类似于 @VMykyt 的东西,因为交叉连接似乎需要更长的时间才能运行。
      • @matthiasdenu 这是相同的交叉连接,因为没有ON 条件的FROM rand, source_table 是交叉连接。你最好使用 ANSI 连接语法
      • @matthiasdenu 另请参阅此内容以获得更好的理解:stackoverflow.com/a/46843832/2700344
      • @matthiasdenu 通常应该运行 map-join,如果没有,请检查:stackoverflow.com/a/49154414/2700344
      猜你喜欢
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2011-02-19
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      相关资源
      最近更新 更多