😊
【python/DeltaLake】無効な文字に対する対処法
執筆日
2024/09/14
発生事情
Microsoft FabricのNotebookでcsvファイルを読み込みTablesに保存しようと思い、以下のコードを実行する。
df = spark.read.format("csv").option("header","true").load("Files/test.csv")
df.write.mode("overwrite").format("delta").save("Tables/test")
以下のエラーが出現。
File /opt/spark/python/lib/pyspark.zip/pyspark/sql/readwriter.py:1398, in DataFrameWriter.save(self, path, format, mode, partitionBy, **options)
1396 self._jwrite.save()
1397 else:
-> 1398 self._jwrite.save(path)
File ~/cluster-env/trident_env/lib/python3.10/site-packages/py4j/java_gateway.py:1322, in JavaMember.__call__(self, *args)
1316 command = proto.CALL_COMMAND_NAME +\
1317 self.command_header +\
1318 args_command +\
1319 proto.END_COMMAND_PART
1321 answer = self.gateway_client.send_command(command)
-> 1322 return_value = get_return_value(
1323 answer, self.gateway_client, self.target_id, self.name)
1325 for temp_arg in temp_args:
1326 if hasattr(temp_arg, "_detach"):
File /opt/spark/python/lib/pyspark.zip/pyspark/errors/exceptions/captured.py:175, in capture_sql_exception.<locals>.deco(*a, **kw)
171 converted = convert_exception(e.java_exception)
172 if not isinstance(converted, UnknownException):
173 # Hide where the exception came from that shows a non-Pythonic
174 # JVM exception message.
--> 175 raise converted from None
176 else:
177 raise
AnalysisException: Found invalid character(s) among ' ,;{}()\n\t=' in the column names of your schema.
Please enable Column Mapping on your Delta table with mapping mode 'name'.
You can use one of the following commands.
原因
DataFrameのカラム名に無効な文字が含まれているため発生しました。
具体的には、具体的には、スペースや特殊文字(例: , ; { } ( ) \n \t =)が対象です。
対処方法
対象のカラム名からこれらの無効な文字を削除 or 書き換えを実施
例
df = df.toDF(*(c.replace(' ', '_') for c in df.columns))
Discussion