纠正格式错误的 CSV 并将纠正后的数据拉回数据帧

问题描述

更新如下.....

自动 csv 数据转储到我们的后端,看起来数据中隐藏了一些格式错误的项目。有一个职业名称,在两个词之间错误地包含一个 \n。这破坏了我们的数据,这就是问题所在。

我想在 csv 中作为全文阅读,regexp_replace 标题与更正,然后将这个固定的全文加载到一个新的数据框中,就像我加载了一个正确的 csv 一样开始......这是我的疯狂之处现在:大声笑。

# Import in the functions I need
# from pyspark.sql.functions import col

# Looks like there is a job family title with an issue. There's a carriage return / line Feed between two words messing up the csv
# This needs to be patched before we actually pull the data into the dataframes to begin work

data_requisitions_patch0 = spark.read.text('abfss://container@somethingcool.dfs.core.windows.net/Data/brokencsv.csv',wholetext=True)
data_requisitions_patch0.collect()
data_requisitions_new = data_requisitions_patch0
# print(data_requisitions_patch0)
# data_requisitions_patch0.printSchema()
# data_requisitions_patch0.show()

data_requisitions_patch1 = data_requisitions_patch0 \
  .withColumn("value",regexp_replace(col('value'),'Job - Starting\n','Job - Starting'))
data_requisitions_patch1.collect()

print('patch0')
data_requisitions_new.count()
print('patch1')
data_requisitions_patch1.count()

# print('Patch0 dataframe: ' + data_requisitions_patch0.count())
# print('Patch0 dataframe: ' + data_requisitions_patch1.count())
# data_requisitions_test0 = spark(data_requisitions_patch1,header=True)
# data_requisitions_test1 = spark.read.csv('abfss://container@somethingcool.dfs.core.windows.net/Data/brokencsv.csv',header=True)

# data_requisitions_test0.count()
# data_requisitions_test0.printSchema()

# data_requisitions_test1.count()
# data_requisitions_test1.printSchema()

现在显然一团糟,我正在尝试解决 regexp_replace 是否正常工作,但运气不佳。然后我突然想到我有一个单行单列数据框。现在我正在尝试弄清楚如何在“补丁”后获取数据帧并将其转换回普通的 csv 数据帧,就像一切正常一样。

我留下了我所有的测试废话,以为你可能会看到我的头在哪里......不确定这是否有帮助。链接显然是伪造的。

首先:我的方向是否正确?这其中没有任何部分真正起作用..我什至无法计数。 test1.count() 确实返回...但 test0.count() 没有?我什至不关心计数,我只是想弄清楚为什么它不起作用。

其次:格式错误的 csv -> 全文本数据框 -> 正则表达式修复了问题 -> 修复了数据框具有正确的标题、行,就像正常一样。

我好吗?

========

更新

取得了很大的进步,我最终在 \n 换行符上拆分了整个文本数据框并将其分解为行。这很好用。现在数据框准确地有它应该有多少行。现在正在尝试找出如何重新映射列以正确创建列。

考虑将标题行纳入其中并尝试将其用作地图?不知道,还在研究中。

解决方法

我没有正确地接近这个......就像一个典型的 C# 项目一样处理这个,从数据库和进程中提取数据。但这并不能很好地解决这个问题。最终将处理过的数据放入数据帧本身并从包含的列中运行我的 if 检查。效果非常好,而且比尝试提取数据进行检查要快得多。