概要
Databricks にて共有アクセス(shared access mode)モードを利用して、 int64 のカラムをもつ Pandas を double 型のスキーマを指定して Spark データフレームに変換すると下記のようなエラーとなるようです。本エラーは今後の Databricks の機能アップデートにより解消されるかもしれませんが、備忘録として残しておきます。対応方法としては、Pandas にて int64 を double に変換する方法とシングルユーザーアクセスモードを利用する方法があります。
PySparkTypeError: [CANNOT_ACCEPT_OBJECT_IN_TYPE]
DoubleType()
can not accept object1
in typeint
.
エラーの再現方法
1. 共有アクセス(shared access mode)モードのクラスターを作成
2. Pandas から Spark データフレームへの変換を実施してエラーとなることを確認
import pandas as pd
# int64 型のカラムを持つデータフレームを作成
pdf = pd.DataFrame({
'numeric_col': pd.Series([1, 2, 3], dtype='int64')
})
# Pandas から Spark データフレームに変換
sdf = spark.createDataFrame(
pdf,
"numeric_col double",
)
sdf.display()
対応方法
1. Pandas にて int64 を double に変換する方法
import pandas as pd
# int64 型のカラムを持つデータフレームを作成
pdf = pd.DataFrame({
'numeric_col': pd.Series([1, 2, 3], dtype='int64')
})
# numeric_col を double 型に変換
pdf['numeric_col'] = pdf['numeric_col'].astype('float64')
# Pandas から Spark データフレームに変換
sdf = spark.createDataFrame(
pdf,
"numeric_col double",
)
sdf.display()
2. シングルユーザーアクセスモードを利用する方法
import pandas as pd
# int64 型のカラムを持つデータフレームを作成
pdf = pd.DataFrame({
'numeric_col': pd.Series([1, 2, 3], dtype='int64')
})
# Pandas から Spark データフレームに変換
sdf = spark.createDataFrame(
pdf,
"numeric_col double",
)
sdf.display()