繁体   English   中英

如何将 SAS 函数转换为 Hive SQL

[英]How to convert SAS functions to Hive SQL

How can I convert this SAS SQL Script that contains some specific SAS functions to Hive SQL? 我需要做出这些逻辑等价。 我阅读了 SAS 文档,但没有找到任何直接转换此创建选择脚本的方法。 谁能帮我这个? 谢谢!

CREATE TABLE QUERYFORTEST_2 AS
   SELECT t1.date_h,
          t1.en_id,
          t1.eu_1,
          t1.eu_2,
          t1.eu_3,
          t1.eu_4,
            (INPUT(SUBSTR(t1.enc_id,ANYALNUM(t1.en_id),(ANYALPHA(t1.en_id) -1 )), 18. )) FORMAT=COMMA18. LABEL="enid" AS 'enid',
  (CASE
     WHEN MISSING (t1.eu_1)= 1
     THEN 0
     ELSE t1.eu_1
  END
  ) FORMAT=COMMA18. AS eu_1b,
  (CASE
         WHEN MISSING (t1.eu_2)= 1
         THEN 0
         ELSE t1.eu_2
      END

      ) FORMAT=COMMA18. AS eu_2b,
      (CASE
         WHEN MISSING (t1.eu_3)= 1
         THEN 0
         ELSE t1.eu_3
      END

      ) FORMAT=COMMA18. AS eu_3b,
      (CASE
         WHEN MISSING (t1.eu_4)= 1
         THEN 0
         ELSE t1.eu_4
      END

      ) FORMAT=COMMA18. AS eu_4b
FROM QUERYFORTEST_1 t1;

有 SAS 特定语法与将 FORMAT 或 LABEL 附加到几个字段相关,

FORMAT=COMMA18.
LABEL="enid" 

你可以删除它。

MISSING() function 测试变量是否丢失(将结果与 1 进行比较是多余的,因为值 1 已被 SAS 视为 TRUE)。 要测试通用 SQL 中是否缺少值,请使用 IS NULL 构造。

WHEN t1.eu_3 IS NULL

这样就剩下了复杂的表达式:

INPUT(
 SUBSTR(t1.enc_id
       ,ANYALNUM(t1.en_id)
       ,ANYALPHA(t1.en_id) -1 
       )
 , 18. 
)
AS 'enid'

所以基本上这就是将 EN_ID 字符串的一部分转换为一个数字,然后将其称为 ENID。 我不确定 SAS 或 HIVE 是否会批准目标名称周围的单引号。

So the SUBSTR() function should be available in HIVE (or some equivalent function.) The INPUT() function you might need to translate into a CAST() function call instead. 但是为了弄清楚将值的哪一部分转换为数字,您可能需要查看 HIVE 用于运行正则表达式的工具。

您应该查看一些 EN_ID 值并弄清楚为什么 SAS 代码试图将部分值转换为数字,而不是将其保留为字符串。 如果给定的代码甚至可以工作,我会感到惊讶。 为什么 substring 的长度与字符串中第一个字母的位置有关? 如果是这种情况,那么为什么不将 substring 的开头作为字符串中的第一个字符呢? 否则,您最终可能会在传递给 INPUT() function 的值中包含第一个字母,这将导致无法转换为数字。 如果字符串的第一个字符是字母,那么您将传递 SUBSTR() 长度为零。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM