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