雑記 in hibernation

頭の整理と備忘録

【あるある】数値をちゃんとソートできないと思ったら文字型になってた

タイトル以上でも以下でもありません。個人的あるあるなんですが、たまにしか引っかからない分、毎回原因に気づくまでに時間がかかるんですよね、、、、

どういうことかと言いますと、

こんな感じのデータがありまして、、、、

id payment
0 aaa 10000
1 bbb 2000
2 ccc 1500


df.show()
+---+-------+
| id|payment|
+---+-------+
|aaa|  10000|
|bbb|   2000|
|ccc|   1500|
+---+-------+


ソートします

できてないんだが。

df.sort("payment").show()
+---+-------+
| id|payment|
+---+-------+
|aaa|  10000|
|ccc|   1500|
|bbb|   2000|
+---+-------+


よく見たら文字型になってました

てへぺろってやつです。文字型の場合、左の文字から参照してソートするので、数字と同じような順序にはならんわけですね。

df.printSchema()
root
 |-- id: string (nullable = true)
 |-- payment: string (nullable = true)


ちゃんと数値にしてソートします

当然、ちゃんとソートできます。

# 数値型に型変換
df_cast = df.withColumn("payment", fn.col("payment").cast("int"))
df_cast.sort("payment").show()
+---+-------+
| id|payment|
+---+-------+
|ccc|   1500|
|bbb|   2000|
|aaa|  10000|
+---+-------+


おわりに

これ、文字列のままソートしてもデータによってはぱっと見で違和感がなく、気づきにくかったりするので結構怖いんですよね。ソート云々以前に、変数の型はちゃんと狙い通りに定義しておきましょうって話です。