📑
【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