時々見るエラーですが、大きなテーブルを読み込むETL処理で出た時などは、だいぶ辛い気分になります。
UnicodeEncodeError: 'utf-8' codec can't encode characters in position 0-1: surrogates not allowed
SQLで該当を探す
SparkやBeamを使って大規模データを処理をしている時には、目の前にエラーがあって当たりもついているのに実際のデータを簡単に見る術が無いというのは辛いです。
カラム数や行数が小さいテーブルなら、普通にダンプしたり、デバッグしながら探すのもありだと思います。ログなんて出そうものなら凄いことになりますし。
今回は愚直ですが以下のように対象を絞る手段にしました。
以下で言うと TOP(300)
TOP(200000)
DESC or ASC
を調整しながら対象を絞る感じです。
SELECT TOP(300) * FROM ( SELECT TOP(20000) * FROM [dbo].[TableA] ORDER BY [primary_key] DESC )
今回はこんな風に記号が入っていました。既に稼働しているDBからデータをETLしてくると必ず何かありますね・・他にも西暦1年のデータが来てエラー起こるとかあるあるです。
Python側対応
参考URLを見て、データ抜き出し処理のところに以下の対応を入れました。
my_val.encode('utf-16', 'surrogatepass').decode('utf-16')