【问题标题】:Random String Function in BigQueryBigQuery 中的随机字符串函数
【发布时间】:2019-07-22 01:34:19
【问题描述】:

当我遇到answer 时,我正试图在 BigQuery 中生成随机字符串。

SELECT
    word
FROM
    `publicdata.samples.shakespeare`
WHERE
    RAND() < 10/(
    SELECT
        COUNT(*)
    FROM
        `publicdata.samples.shakespeare`)

它有效,但我需要根据该答案创建一个函数。这是我尝试转换它但没有运气。

CREATE TEMP FUNCTION
    random_word() AS ( (
        SELECT
            STRING_AGG(word, "_") AS aggd_word
        FROM (
            SELECT
                LOWER(REPLACE(word, "'", "")) AS word
            FROM
                `publicdata.samples.shakespeare`
            WHERE
                RAND() < 10/(
                SELECT
                    COUNT(*)
                FROM
                    `publicdata.samples.shakespeare`)
            LIMIT
                3)) );
SELECT
    random_word();

我收到了这个错误

Table not found: `publicdata.samples.shakespeare`;
failed to parse CREATE [TEMP] FUNCTION statement at [25:9]

【问题讨论】:

  • 字符串中可以包含哪些字符?例如,任何 UTF-8 代码点,还是您专门针对 a-zA-Z0-9?字符串长度的上限和下限是多少?
  • @ElliottBrossard a-zA-Z0-9 就足够了。字符串的长度不是我关心的。但不要太长,最多 64 个字符。基本上只是一个随机字符串(不是 UUID)生成器。
  • @Bobbylank 谢谢,需要更彻底地阅读文档
  • 没问题,希望您能找到解决问题的其他方法

标签: google-bigquery


【解决方案1】:

一种方法是将散列转换为所需范围内的字符:

CREATE TEMP FUNCTION MapChar(c INT64) AS (
  CASE
    WHEN c BETWEEN 0 AND 9 THEN 48 + c -- 0 to 9
    WHEN c BETWEEN 10 AND 35 THEN 55 + c -- A to Z
    ELSE 61 + c -- a to z
  END
);

CREATE TEMP FUNCTION RandString() AS ((
  SELECT CODE_POINTS_TO_STRING(ARRAY_AGG(MapChar(MOD(c, 62))))
  FROM UNNEST(TO_CODE_POINTS(SHA256(CAST(RAND() AS STRING)))) AS c
));

SELECT RandString();

如果你想要更长的字符串,你可以使用SHA512 而不是SHA256

【讨论】:

    猜你喜欢
    • 2017-05-20
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 2021-05-18
    • 2018-01-25
    • 1970-01-01
    相关资源
    最近更新 更多