📑

【Databricks】スキーマ適用前後で値が変わるの意味がわからない件について

に公開

スキーマ適用前後で値が変わるの意味がわからない件について

起こったこと

スキーマ適用したら値が変わった。

スキーマ定義

schema = StructType([
    StructField("Delivery_person_ID", StringType(), True),
    StructField("Delivery_person_Age", IntegerType(), True),
    StructField("Delivery_person_Ratings", DoubleType(), True),
    StructField("Restaurant_latitude", DoubleType(), True),
    StructField("Restaurant_longitude", DoubleType(), True),
    StructField("Delivery_location_latitude", DoubleType(), True),
    StructField("Delivery_location_longitude", DoubleType(), True),
    StructField("Time_Orderd", StringType(), True),
    StructField("Time_Order_picked", StringType(), True),
    StructField("Weather_conditions", StringType(), True),
    StructField("Road_traffic_density", StringType(), True),
    StructField("Type_of_order", StringType(), True),
    StructField("Type_of_vehicle", StringType(), True),
    StructField("multiple_deliveries", IntegerType(), True),
    StructField("Time_taken(min)", IntegerType(), True)
])

スキーマを適用せずに読み込む場合

df = spark.read.option("header","true").csv(path_data)
display(df.head(5))
_c0 ID Delivery_person_ID Delivery_person_Age Delivery_person_Ratings Restaurant_latitude Restaurant_longitude Delivery_location_latitude
0 4607 INDORES13DEL02 37 4.9 22.745049 75.892471 22.765049
1 B379 BANGRES18DEL02 34 4.5 12.913041 77.683237 13.043041
2 5D6D BANGRES19DEL01 23 4.4 12.914264 77.6784 12.924264
3 7A6A COIMBRES13DEL02 38 4.7 11.003669 76.976494 11.053669
4 70A2 CHENRES12DEL01 32 4.6 12.972793 80.249982 13.012793

スキーマを適用してに読み込む場合

df = spark.read.option("header","true").schema(schema).csv(path_data)
display(df.limit(5))
Delivery_person_ID Delivery_person_Age Delivery_person_Ratings Restaurant_latitude Restaurant_longitude Delivery_location_latitude Delivery_location_longitude Time_Orderd Time_Order_picked Weather_conditions Road_traffic_density Type_of_order Type_of_vehicle multiple_deliveries Time_taken(min)
4607 null 37 4.9 22.745049 75.892471 22.765049 75.912471 Snack motorcycle 24 null null null null
null null 34 4.5 12.913041 77.683237 13.043041 77.813237 Snack scooter 33 null null null null
null null 23 4.4 12.914264 77.6784 12.924264 77.6884 Drinks motorcycle 26 null null null null
null null 38 4.7 11.003669 76.976494 11.053669 77.026494 Buffet motorcycle 21 null null null null
null null 32 4.6 12.972793 80.249982 13.012793 80.289982 Snack scooter 30 null null null null

特に異常値が入っているわけでもないことは確認済み

df.select("Delivery_person_Age").distinct().show()
Delivery_person_Age
15
29
30
34
22
28
35
31
27
26
23
38
25
33
24
32
20
36
37
39

解決策

小一時間悩みでいたところ、矢木に電流走る
生データのIDの値4607がスキーマ適用後のDelivery_person_Ageに入ってね?

schema = StructType([
    StructField("_c0",StringType(), True), #追加
    StructField("ID", StringType(), True), #追加
    StructField("Delivery_person_ID", StringType(), True),
    StructField("Delivery_person_Age", IntegerType(), True),
    StructField("Delivery_person_Ratings", DoubleType(), True),
    StructField("Restaurant_latitude", DoubleType(), True),
    StructField("Restaurant_longitude", DoubleType(), True),
    StructField("Delivery_location_latitude", DoubleType(), True),
    StructField("Delivery_location_longitude", DoubleType(), True),
    StructField("Time_Orderd", StringType(), True),
    StructField("Time_Order_picked", StringType(), True),
    StructField("Weather_conditions", StringType(), True),
    StructField("Road_traffic_density", StringType(), True),
    StructField("Type_of_order", StringType(), True),
    StructField("Type_of_vehicle", StringType(), True),
    StructField("multiple_deliveries", IntegerType(), True),
    StructField("Time_taken(min)", IntegerType(), True)
])

生データにある列全てのスキーマを定義したらうまくいった。
スキーマ適用時には、列の名前で対応・適用じゃなくて、順番で対応・適用なのかしら

Discussion