如何使用正则表达式从 PySpark databricks 笔记本中的文件中解析表名

Posted

技术标签:

【中文标题】如何使用正则表达式从 PySpark databricks 笔记本中的文件中解析表名【英文标题】:How to use regex to parse the Tablename from a file in PySpark databricks notebook 【发布时间】:2021-10-28 06:24:03 【问题描述】:

我正在尝试使用正则表达式从镶木地板文件中获取表名。我正在使用以下代码尝试此操作,但 ctSchema 数据框似乎没有运行,导致作业返回 0 结果。

    ci= spark.createDataFrame(data=[("","","")], schema=ciSchema)
    files=dbutils.fs.ls('a filepath goes here')
    
    results = 
    is_error = False
    
    for fi in files:
          try:
            dataFile = spark.read.parquet(fi.path)
            ctSchema = spark.createDataFrame(data = dataFile.dtypes, schema = tSchema).withColumn("TableName", regexp_extract(input_file_name(),"([a-zA-Z0-9]+_[a-zA-Z0-9]+)_shard_\d+_of_\d+\.parquet",1), lit(fi.name))
            ci = ci.union(ctSchema)
          except Exception as e:
            results[fi.name] = f"Error: e"
            is_error = True

【问题讨论】:

为什么要单独读取文件? Spark 应该能够一次读取所有文件。并尝试minimize your code关注问题 刚开始使用 Spark,所以还不太确定正确的语法。进行了一些编辑以专注于代码的主要问题 试试这个df = spark.read.parquet('a filepath goes here') 来读取文件。我猜你的主要问题是关于regexp_extract?您能否提供示例输入和您的预期输出? 示例输入为 TCP_119Customer_page_1_of_1.parquet,因此输出为 119Customer 【参考方案1】:

您的正则表达式 ([a-zA-Z0-9]+_[a-zA-Z0-9]+)_shard_\d+_of_\d+\.parquet 不正确,请尝试使用这个 [a-zA-Z0-9]+_([a-zA-Z0-9]+)_page_\d+_of_\d+\.parquet

首先,我使用了page_ 而不是shard_,这与您的文件名匹配。

其次,您不想将与TCP_119Customer 匹配的([a-zA-Z0-9]+_[a-zA-Z0-9]+) 分组。您只需要第二组,因此将其更改为 [a-zA-Z0-9]+_([a-zA-Z0-9]+) 将解决此问题。

【讨论】:

解决了我的问题,我发过来的东西只是样本文件的命名无关紧要,但处理丢失的变量是一个单独的错误。

以上是关于如何使用正则表达式从 PySpark databricks 笔记本中的文件中解析表名的主要内容,如果未能解决你的问题,请参考以下文章

从字符串 PySpark 数据框列中删除正则表达式

PySpark array_remove 元素正则表达式问题

如何在 Pyspark 中基于正则表达式条件验证(和删除)列,而无需多次扫描和改组?

如何在 PySpark 中编写条件正则表达式替换?

pyspark:删除作为另一列值的子字符串,并从给定列的值中包含正则表达式字符

如何替换/删除 PySpark RDD 中的正则表达式?