😊

【python/DeltaLake】無効な文字に対する対処法

2024/09/14に公開

執筆日

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