使用 Airflow,我们将数据从 Google Cloud SQL 导出到 CSV,并最终将该 CSV 加载到不同的 SQL 仓库中。但是,Cloud SQL 会将空值导出为字符串"N
(这是一个已知的 Google 问题:https://issuetracker.google.com/issues/64579566(。作为临时步骤,我们需要打开文件并删除"N
。 csv 中也有实际的字符串,通常使用"
。
理想情况下,我们可以用熊猫来做到这一点 - 我们设置为在下一步中使用数据帧。 但是,我无法read_csv将"N
解释为空值。 这是我尝试过的基本命令:
df = pd.read_csv(filepath, na_values='"N')
我也尝试过na_values=""N"
,但这给了我相同的结果。
似乎read_csv
首先检查字符串,然后检查空值,所以我得到的输出如下所示:
Id 100
IncidentDate 2018-08-29 07:00:00
StudentInvolved Psueudonym
IncidentLocation Classroom
IncidentCategory Academic dishonesty
IncidentDescriptionDetails [TESTING] How does this insert into table when...
FollowUp 0
ConsequenceGiven Afterschool Academy
ConsequenceStartDate N,N
ConsequenceEndDate N,N
PrimaryViolation <email address>
Weapon <school_name>
CreatedBy N,N
SiteName 1000
DisciplinaryActionAuthority N,0,N
DocumentationUrl N,N
SIS_ID N,N
SubmittedBy N,N
Deleted N,N
FollowUpNotes N,N
StudentLists_fk N,N
关于read_csv
是否能够解析它的任何想法?
您需要在加载到 pandas 数据帧之前替换该值。一种方法是在 Linux 中使用sed
命令。
sed 's/"N/NULL/g' <filename>.csv
然后加载到熊猫中
自动执行导出语句:
folderName=`date +%m-%d-%Y`
fileName=`date +%H:%M:%S`
gs_path="gs://generic_test/$folderName/$fileName.csv"
gcloud sql export csv upc-asin-mapping $gs_path --query="select * from tableName;" --database=db_name
gsutil -m cp $gs_path .
sed -i "" 's/"N/NULL/g' $fileName.csv
gsutil -m cp $fileName.csv $gs_path
上面的脚本会下载文件,将"N
替换为NULL
,然后重新上传同名的同一文件。 这不是一种可扩展的方法。
最终不得不通过替换文本来暴力破解它。
with open(filepath, 'r', encoding="utf-8") as inputFile:
raw_text = inputFile.read()
edited_text = raw_text.replace('"N,', ',')
edited_text = edited_text.replace(',"Nn', ',n')
with open(edited_filepath, 'w', newline='n', encoding="utf-8") as outputFile:
outputFile.write(edited_text)
df = pd.read_csv(edited_filepath, names=incident_columns)
一个缺点是这会弄乱任何合法以N,
或Nn
开头的字符串,但希望我们的用户没有输入这样东西的习惯。