如何使用正则表达式从 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 array_remove 元素正则表达式问题
如何在 Pyspark 中基于正则表达式条件验证(和删除)列,而无需多次扫描和改组?