【问题标题】:Spark SQL regex to extract date, file name and brandSpark SQL 正则表达式提取日期、文件名和品牌
【发布时间】:2021-10-25 03:13:32
【问题描述】:

目前我有几个文件,我想将它们上传到数据库,创建带有一些元数据的新列。我拥有的文件示例如下:

MYBRAND-GOOD_20210202.tab
MYBRAND-BAD_20210202.tab
MYBRAND_20210202.tab

每个文件都有 x、y、z 列,另外我想根据文件的某些属性创建 3 个带有元数据的新列。我想要的结果如下:

Table MYBRAND-GOOD

x | y  | z  | brand  | FILE_DATE  | SOURCE_DETAILS  | Name 
a.  b    c     GOOD      20210202       tab            MYBRAND-GOOD_20210202


Table MYBRAND-BAD

x | y  | z  | brand  | FILE_DATE  | SOURCE_DETAILS  | Name 
a.  b    c     BAD      20210202       tab            MYBRAND-BAD_20210202

Table MYBRAND

x | y  | z  | brand        | FILE_DATE  | SOURCE_DETAILS  | Name 
a.  b    c     MYBRAND      20210202       tab            MYBRAND_20210202

我目前正在做的事情如下:

SELECT x,y,z,
       split(INPUT_FILE_NAME(),'- | _')[1] AS brand,
       regexp_extract(INPUT_FILE_NAME(), '.*/modified_dttm=(.*)/.+', 1) AS FILE_DATE,
       regexp_extract(regexp_replace(INPUT_FILE_NAME()\\,'%20'\\,'')\\, '.*/.*-([0-9]{4}-[0-9]{2}-[0-9]{2}).tab'\\, 1)) AS SOURCE_DETAILS
       regexp_extract(INPUT_FILE_NAME(), '^([^\.]+)\.?', 0) AS NAME

但是我面临几个问题(因为我对正则表达式不是很精通):

  • 如果没有“-”分隔符,则品牌失败(如“MYBRAND”中的)
  • 我不确定 'FILE_DATE' 是否符合预期
  • SOURCE_DETAILS 给我的结果是空的
  • NAME 没问题,但我想排除 '.'

如果有人可以指导我使用这个我没有完全遵循的正则表达式规则,我将不胜感激。

【问题讨论】:

    标签: sql regex apache-spark pyspark


    【解决方案1】:

    我们可以为整个字符串编写一个模式,并为每个所需元素改变 regexp_extract() 的索引参数。

    (Mybrand(-([A-Za-z0-9]*))?_(\d{8,8}))\.(\w+)
    

    每次使用该模式,您可以选择要显示的捕获组

    Select x,y,z
       Regexp_extract(INPUT_FILE_NAME(),'(Mybrand(-([A-Za-z0-9]*))?_(\d{8,8}))\.(\w+)', 3) AS Brand,
       Regexp_extract(INPUT_FILE_NAME(),'(Mybrand(-([A-Za-z0-9]*))?_(\d{8,8}))\.(\w+)', 4) AS FileDate,
       Regexp_extract(INPUT_FILE_NAME(),'(Mybrand(-([A-Za-z0-9]*))?_(\d{8,8}))\.(\w+)', 5) AS SourceDetails,
       Regexp_extract(INPUT_FILE_NAME(),'(Mybrand(-([A-Za-z0-9]*))?_(\d{8,8}))\.(\w+)', 1) AS Name
    

    您为要捕获的每个子模式加上括号,因此我们从开头的括号对开始捕获名称。然后我们扫描 MYBRAND,然后开始一个新的括号组,因为连字符是可选的。然后我们开始第三个括号组来捕获组成品牌的字母数字 [A-Za-z0-9]*。星号让组为空,这将检索空值。接下来是一个下划线,后跟一组新的括号来捕获构成日期 \d{8,8} 的数字。我们在这里关闭第一个括号来结束文件名捕获,然后是一个点,最后一个括号来捕获文件类型 (\w+)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      相关资源
      最近更新 更多