【问题标题】:Snowflake hidden Ascii characters雪花隐藏的 Ascii 字符
【发布时间】:2022-01-13 13:31:28
【问题描述】:

我在下面附上了一张图片,说明了我的问题。 我也看过这个: Removing or replacing ascii null character <0x00> from column in SnowflakeRemove non-ASCII characters from a string in Snowflake 使用我的代码发布并实施或尝试相同的方法。 现在,开始我的代码。 我知道问题是这个带有雪花的“内部”VW_QUERY_HISTORY 视图。我认为这是日期问题,但不是。我什至在日期上做 UTC,以防雪花在其智慧中使用位置时间。 所以任何建议都会很棒;很明显,我已经把它包裹和修剪得够多了。

select  RTRIM(replace(replace(a.Full_Table_Name, char(32), ''), char(13), ''),'  ') as Full_Table_Name
,RTRIM(replace(replace(TRIM(replace(UPPER(Full_Table_Name),'TEST_DATABASE.DUMMY_SCHEMA.','' )), char(32), ''), char(13), ''),'  ') as Short_Table_Name_1
,log.TABLE_NAME as AUDIT_LOGGIN_TABLE_NAME
from (
  
  select  replace (replace(UPPER(substring(QUERY_TEXT,11,charindex('from',QUERY_TEXT)-12)) , char(32), ''), char(13), '') as Full_Table_Name
  ,to_date(convert_timezone('UTC',START_TIME) ) as ETL_DATE
from  "TEST_DATABASE"."AUDIT_LOGGING"."VW_QUERY_HISTORY" as vw
where substring(QUERY_TEXT,11,charindex('from',QUERY_TEXT)-12) like '%DUMMY_SCHEMA%'
and QUERY_TYPE = 'COPY'
and UPPER(substring(QUERY_TEXT,11,charindex('from',QUERY_TEXT)-12))  like '%TEST_DATABASE.DUMMY_SCHEMA%'
 and to_date(START_TIME) >= dateadd(day,-1,current_date() )
  
) as a
LEFT JOIN TEST_DATABASE.AUDIT_LOGGING.DUMMY_SCHEMA_SOURCE_TABLE_COUNTS as log  on replace (replace(UPPER(replace(UPPER(log.TABLE_NAME),'SCPOMGR.','')), char(13), ''), char(32), '') =  TRIM(regexp_replace(replace (replace(TRIM(replace(UPPER(Full_Table_Name),'TEST_DATABASE.DUMMY_SCHEMA.','' )), char(13), ''), char(32), ''), char(32), ''),char(32))
and log.ETL_Date = 20211207
// and a.ETL_DATE = convert_timezone('UTC', to_date(concat(substring(log.ETL_DATE,0,4),'-',substring(log.ETL_DATE,5,2),'-',substring(log.ETL_DATE,7,2) ) ) )

【问题讨论】:

  • 我还应该指出。 . . LEFT JOIN TEST_DATABASE.AUDIT_LOGGING.DUMMY_SCHEMA_SOURCE_TABLE_COUNTS 是我自己围绕这个特定数据集市的表,我在其中记录当天负载的增量的聚合计数。这是上图中的第 7 行。
  • 我没有关注您的问题/问题。我看到了空白和诸如此类的东西,但是我不明白您要在这里解决什么。您的 sql 很厚,并且试图将其变薄以便我可以复制是一件苦差事。您是否有一个最小的、可验证且可重现的示例,或者您能否更好地解释您试图从 query_history 日志中的 COPY 语句中挑选出什么以及您试图将其加入到什么(可能是一些示例数据和期望的结果会有帮助吗?)。
  • 另外,我不明白你的sql语句和你的截图之间的关系。您的屏幕截图中的列比您在 SQL 中选择的列多得多。
  • 嗨@JNevill,主要是我试图将名为 VW_QUERY_HISTORY 的“内部”雪花视图加入到我的 table_name 和 date 列上的表中。它在 17 个实例中的 16 个上运行良好,除了这 1 个情况,即使在删除“空格”之后,我似乎也有尾随空格。就像我在屏幕截图中指出的那样。因此,我没有从我的表中获取表名或记录数(作为左连接)。
  • 您能否将您从COPY 语句中提取的表原样复制/粘贴到问题中,包括您获得的空格?

标签: snowflake-cloud-data-platform snowflake-schema


【解决方案1】:

只是为了完善我的建议。我认为尝试使用charindexsubstringreplace 等解析 SQL 会导致比尝试使用正则表达式解析更多的边缘情况。

我相信类似以下的内容会让你大吃一惊:

SELECT 
    REGEXP_REPLACE(Query_Text, '^.*COPY INTO (["0-9a-z._$]*).*$','\\1',1,1,'si') as Full_Table_Name
    ,strtok(FULL_TABLE_NAME, '.', REGEXP_COUNT(Full_Table_Name, '[.]')+1) AS Short_table_name
    ,to_date(convert_timezone('UTC',START_TIME) ) as ETL_DATE
    ,query_Text
FROM  "TEST_DATABASE"."AUDIT_LOGGING"."VW_QUERY_HISTORY"
WHERE QUERY_TYPE = 'COPY'
  AND to_date(START_TIME) >= dateadd(day,-1,current_date() );

REGEXP_REPLACE 正在捕获 COPY INTO 之后的字符串,该字符串包含字符 0-9、az(不区分大小写)、._$ 的任意组合Snowflake 中对象名称中允许的字符数。当遇到任何其他字符(空格、分隔空格、回车/换行等)时,它将停止捕获。这是更简单的证明,因为只有允许的字符才能通过。

同样适用于您的 Short_Table_Name 逻辑,我使用 STRTOK() 按句点拆分 Full_Table_Name 并从拆分中选择最后一项。再次使用正则表达式获取句点字符数并加 1(strtok 是基于 1 的索引)。

【讨论】:

  • REGEXP_REPLACE 给出了预期的结果。谢谢你 。代表添加了。
  • 很高兴听到它成功了!
猜你喜欢
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多