ChatGPT 数据仓库实战:Kaggle 酒店入住数据分析与维度建模

简介: ChatGPT 数据仓库实战:Kaggle 酒店入住数据分析与维度建模

以下内容产生背景为:体验 ChatGPT 在大数据领域有哪些场景可以提高效率,主要使用 Kaggle 酒店入住数据进行维度建模和数据分析方面的模拟测试。虽然部分输出是错误的(可以在留言区讨论哈),如果把这个做成标准的工作流,形成一个产品,那会提高很多人的效率哈(很多人可能也会失业)。感受到了很大的危机🥹以下为人机交互生成:👇👇👇

Human:我希望你是一个大数据专家,熟悉使用 Hive SQL,python,shell 等开发语言,给出一个数据仓库维度建模的方案


Assistant:

好的,以下是一个基于数据仓库维度建模的方案,包括使用Hive SQL、Python和Shell等开发语言进行实现。

  1. 数据源

首先需要确定数据源,这里以一个在线商店为例,假设有以下几个数据表:

  • 订单表(order):包含订单ID、下单日期、订单金额、订单状态等字段。
  • 订单明细表(order_detail):包含订单明细ID、订单ID、商品ID、商品数量、商品单价等字段。
  • 商品表(product):包含商品ID、商品名称、商品分类、商品单价等字段。
  • 用户表(user):包含用户ID、用户姓名、注册日期、用户等级等字段。
  1. 维度设计

根据数据源,确定维度和事实表,这里以星型模型为例:

  • 事实表:订单事实表(fact_order)包含订单ID、下单日期、订单金额、订单状态、用户ID、商品ID、商品数量、商品单价等字段。
  • 维度表:用户维度表(dim_user)包含用户ID、用户姓名、注册日期、用户等级等字段;商品维度表(dim_product)包含商品ID、商品名称、商品分类、商品单价等字段;时间维度表(dim_time)包含日期、星期、月份、季度、年份等字段。
  1. 数据仓库模式

在确定了维度和事实表后,需要设计数据仓库模式。这里使用星型模型,以事实表为中心,维度表围绕事实表建模,如下图所示:

               dim_user
                 |
                 |
               fact_order
                 |
                 |
  dim_time  dim_product

  1. 数据仓库实现

根据数据仓库模式,可以使用 Hive SQL、Python或Shell等开发语言实现数据仓库。

(1)Hive SQL 实现

使用 Hive SQL 可以创建数据表、导入数据、定义维度表和事实表、构建查询语句等。以下是 Hive SQL 实现的示例代码:

-- 创建用户表
CREATE TABLE user (
 user_id STRING,
 name STRING,
 register_date STRING,
 level STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

-- 导入用户数据
LOAD DATA LOCAL INPATH '/path/to/user.csv' OVERWRITE INTO TABLE user;

-- 创建商品表
CREATE TABLE product (
 product_id STRING,
 name STRING,
 category STRING,
 price DOUBLE
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

-- 导入商品数据
LOAD DATA LOCAL INPATH '/path/to/product.csv' OVERWRITE INTO TABLE product;

-- 创建订单表
CREATE TABLE order (
 order_id STRING,
 order_date STRING,
 amount DOUBLE,
 status STRING,
 user_id STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

-- 导入订单数据
LOAD DATA LOCAL INPATH '/path/to/order.csv' OVERWRITE INTO TABLE order;

-- 创建订单明细表
CREATE TABLE order_detail (
 detail_id STRING,
 order_id STRING,
 product_id STRING,
 quantity INT,
 price DOUBLE
)
ROW FORMAT DELIMIT


Human:我们使用 Kaggle 平台上酒店入住数据进行实践一下吧


Assistant:

好的,我们来使用 Kaggle 平台上的酒店入住数据进行实践。

  1. 数据源

我们使用 Kaggle 上的 Hotel Booking Demand 数据集,该数据集包含了2015年至2017年的一些酒店预订数据,包括酒店的一些基本信息和预订的一些详细信息。

  1. 维度设计

根据数据源,我们可以确定以下维度和事实表:

  • 事实表:订单事实表(fact_order)包含订单号、酒店编号、入住日期、离店日期、预订房间数、预订人数、是否取消等字段。
  • 维度表:酒店维度表(dim_hotel)包含酒店编号、酒店名称、酒店所在城市、酒店所在国家等字段;时间维度表(dim_time)包含日期、星期、月份、季度、年份等字段。
  1. 数据仓库模式

根据维度设计,我们可以使用星型模型,以订单事实表为中心,维度表围绕事实表建模,如下图所示:

            dim_hotel
                |
                |
            fact_order
                |
                |
            dim_time

  1. 数据仓库实现

使用 Python 语言,我们可以使用 Pandas 库读取和处理数据,使用 SQLite 数据库存储数据仓库。

(1)Python 实现

首先我们需要导入 Pandas 和 SQLite3 库:

import pandas as pd
import sqlite3

然后,我们读取数据并将其保存到 SQLite 数据库中:

# 读取数据
hotel_data = pd.read_csv("hotel_bookings.csv")

# 创建连接和游标
conn = sqlite3.connect("hotel_booking.db")
cur = conn.cursor()

# 创建酒店维度表
cur.execute('''CREATE TABLE dim_hotel (
              hotel_id TEXT PRIMARY KEY,
              hotel_name TEXT,
              city TEXT,
              country TEXT
           )'
'')

# 导入酒店数据
hotel_data[["hotel", "city", "country"]] = hotel_data[["hotel", "city", "country"]].fillna("Unknown")
hotel_data["hotel_id"] = hotel_data["hotel"].apply(lambda x: "H" + str(hash(x)))
hotel_data[["hotel_id", "hotel", "city", "country"]].drop_duplicates().to_sql("dim_hotel", conn, if_exists="replace", index=False)

# 创建时间维度表
cur.execute('''CREATE TABLE dim_time (
              date TEXT PRIMARY KEY,
              week TEXT,
              month TEXT,
              quarter TEXT,
              year TEXT
           )'
'')

# 导入时间数据
hotel_data["date"] = pd.to_datetime(hotel_data["reservation_status_date"])
hotel_data["week"] = hotel_data["date"].dt.week
hotel_data["month"] = hotel_data["date"].dt.month
hotel_data["quarter"] = hotel_data["date"].dt.quarter
hotel_data["year"] = hotel_data["date"].dt.year
hotel_data[["date", "week", "month", "quarter", "year"]].drop_duplicates().to_sql("dim_time", conn, if_exists


Human:这个数据集有哪些表和字段呢


Assistant:

这个数据集包含了两个表:bookingshotel_listings

bookings 表包含了预订的详细信息,包括以下字段:

  • hotel: 酒店名称
  • is_canceled: 是否取消预订,0 表示未取消,1 表示取消
  • lead_time: 预订日期和入住日期之间的天数
  • arrival_date_year: 入住日期的年份
  • arrival_date_month: 入住日期的月份
  • arrival_date_week_number: 入住日期的周数
  • arrival_date_day_of_month: 入住日期的月中的日期
  • stays_in_weekend_nights: 周末入住天数
  • stays_in_week_nights: 工作日入住天数
  • adults: 成人数量
  • children: 儿童数量
  • babies: 婴儿数量
  • meal: 餐食类型
  • country: 客人的国家
  • market_segment: 客户市场分割
  • distribution_channel: 客户分销渠道
  • is_repeated_guest: 是否是重复预订客户,0 表示不是,1 表示是
  • previous_cancellations: 客户之前的取消预订数量
  • previous_bookings_not_canceled: 客户之前的未取消预订数量
  • reserved_room_type: 预订的房间类型
  • assigned_room_type: 分配的房间类型
  • booking_changes: 客户更改预订的次数
  • deposit_type: 押金类型
  • agent: 预订的代理人 ID
  • company: 预订的公司 ID
  • days_in_waiting_list: 预订时在等待列表中的天数
  • customer_type: 客户类型
  • adr: 平均每晚房价
  • required_car_parking_spaces: 需要的停车位数量
  • total_of_special_requests: 特殊请求的数量
  • reservation_status: 预订状态
  • reservation_status_date: 预订状态的日期

hotel_listings 表包含了酒店的基本信息,包括以下字段:

  • hotel: 酒店名称
  • city: 酒店所在城市
  • country: 酒店所在国家
  • address: 酒店地址
  • latitude: 酒店所在纬度
  • longitude: 酒店所在经度
  • hotel_description: 酒店描述
  • hotel_star_rating: 酒店星级评级
  • number_of_reviews: 酒店评论数量
  • review_score: 酒店平均评分
  • review_score_word: 酒店评分词汇
  • hotel_image_url: 酒店图片 URL

Human:根据上面的表,dwd 层怎么设计?


Assistant:

根据数据仓库的最佳实践,我们可以将 bookingshotel_listings 这两个表的数据分别设计为两个维度表和一个事实表。具体来说,我们可以按照以下方式进行设计:

  • dim_hotel 维度表:包含酒店的基本信息,包括酒店名称、所在城市、国家、地址、经纬度、酒店描述、星级评级等字段。这个维度表可以与 bookings 表通过 hotel 字段进行关联,用于分析每个酒店的预订情况。
  • dim_date 维度表:包含日期的详细信息,包括年、月、日、星期几、是否是节假日等字段。这个维度表可以与 bookings 表通过多个日期字段进行关联,用于分析每个日期的预订情况。
  • fact_booking 事实表:包含预订的详细信息,包括酒店名称、预订日期、入住日期、预订时长、入住时长、成人数量、儿童数量、餐食类型、客人国家、市场分割、分销渠道、是否是重复预订客户、之前取消预订和未取消预订数量、预订的房间类型、分配的房间类型、更改预订次数、押金类型、代理人 ID、公司 ID、等待列表天数、客户类型、平均每晚房价、停车位数量、特殊请求数量、预订状态、预订状态日期等字段。这个事实表与 dim_hoteldim_date 进行关联,用于分析每个酒店、每个日期的预订情况。

此外,在设计 fact_booking 事实表时,我们需要注意以下几点:

  • 对于 booking_changes 字段,我们可以考虑将其拆分成多个度量,如 booking_addsbooking_cancels,分别表示新增预订和取消预订的次数。
  • 对于 adr 字段,我们可以考虑将其拆分成多个度量,如 total_revenueaverage_daily_rate,分别表示总收入和平均每晚房价。
  • 对于 reservation_statusreservation_status_date 字段,我们可以考虑将其拆分成多个度量,如 booking_countcancellation_count,分别表示预订数量和取消数量,并使用日期维度来分析预订状态的变化情况。

Human:可以衍生哪些指标?


Assistant:

根据上面的数据模型,可以衍生出很多有用的指标,以下是一些可能的指标:

  • 酒店入住率:计算每个酒店每天实际入住房间数占可售房间数的比例,以分析酒店的房间利用率。
  • 酒店平均每晚房价:计算每个酒店在特定时间段内的平均房价,以分析酒店的定价策略和市场竞争力。
  • 预订渠道分布:根据预订的分销渠道,计算每个渠道的预订量和预订金额占比,以评估酒店在不同渠道上的市场表现。
  • 客户类型分布:根据客户的类型,计算不同类型客户的预订量和预订金额占比,以评估酒店的客户结构和市场定位。
  • 市场分割分析:根据市场分割信息,计算不同市场分割的预订量和预订金额占比,以评估酒店在不同市场上的市场表现。
  • 预订时长分布:根据预订时长,计算不同预订时长的预订量和预订金额占比,以评估酒店的预订策略和市场需求情况。
  • 餐食类型分布:根据餐食类型,计算不同餐食类型的预订量和预订金额占比,以评估酒店的餐饮服务质量和市场需求情况。
  • 预订取消率:根据预订取消次数和预订总数,计算预订取消率,以评估酒店的预订管理水平和市场需求情况。
  • 重复预订客户率:根据重复预订客户数和预订总数,计算重复预订客户率,以评估酒店的客户忠诚度和市场竞争力。
  • 预订更改率:根据预订更改次数和预订总数,计算预订更改率,以评估酒店的预订管理水平和市场需求情况。
  • 停车位使用率:计算每个酒店每天实际使用停车位数占可用停车位数的比例,以分析酒店的停车位利用率。
  • 特殊请求率:根据特殊请求次数和预订总数,计算特殊请求率,以评估酒店的服务质量和市场需求情况

Human:根据上面的衍生指标,dws 层怎么设计呢?


Assistant:

根据上面的衍生指标,可以在 DWS 层设计一些汇总表和报表,以便于数据分析和决策支持。以下是一些可能的设计:

  • dws_hotel_room_night:按酒店、日期维度统计每天实际入住房间数和可售房间数,计算入住率指标。
  • dws_hotel_price:按酒店、日期、房型维度统计每天的房价,计算平均每晚房价指标。
  • dws_booking_channel:按预订渠道、日期维度统计每天的预订量和预订金额,计算预订渠道分布指标。
  • dws_customer_type:按客户类型、日期维度统计每天的预订量和预订金额,计算客户类型分布指标。
  • dws_market_segment:按市场分割、日期维度统计每天的预订量和预订金额,计算市场分割分析指标。
  • dws_booking_lead_time:按预订时长、日期维度统计每天的预订量和预订金额,计算预订时长分布指标。
  • dws_meal_type:按餐食类型、日期维度统计每天的预订量和预订金额,计算餐食类型分布指标。
  • dws_booking_cancel:按酒店、日期维度统计每天的预订量、取消量和预订金额,计算预订取消率指标。
  • dws_repeat_booking:按酒店、日期维度统计每天的预订量、重复预订客户数和预订金额,计算重复预订客户率指标。
  • dws_booking_change:按酒店、日期维度统计每天的预订量、更改量和预订金额,计算预订更改率指标。
  • dws_parking_utilization:按酒店、日期维度统计每天实际使用停车位数和可用停车位数,计算停车位使用率指标。
  • dws_special_request:按酒店、日期维度统计每天的预订量、特殊请求次数和预订金额,计算特殊请求率指标。

以上是一些可能的设计方案,具体的维度、指标和表结构,需要根据实际情况进行具体分析和设计。


Human:生成对应的表和字段


Assistant:

根据上面的设计方案,我们可以生成以下表和字段:

dws_hotel_room_night:

字段名 类型 描述
hotel_id int 酒店ID
date date 日期
sold_rooms int 可售房间数
occupied_rooms int 实际入住房间数
occupancy_rate float 入住率

dws_hotel_price:

字段名 类型 描述
hotel_id int 酒店ID
date date 日期
room_type string 房型
avg_price float 平均每晚房价

dws_booking_channel:

字段名 类型 描述
booking_channel string 预订渠道
date date 日期
bookings int 预订量
booking_amount float 预订金额

dws_customer_type:

字段名 类型 描述
customer_type string 客户类型
date date 日期
bookings int 预订量
booking_amount float 预订金额

dws_market_segment:

字段名 类型 描述
market_segment string 市场分割
date date 日期
bookings int 预订量
booking_amount float 预订金额

dws_booking_lead_time:

字段名 类型 描述
lead_time int 预订时长(天)
date date 日期
bookings int 预订量
booking_amount float 预订金额

dws_meal_type:

字段名 类型 描述
meal_type string 餐食类型
date date 日期
bookings int 预订量
booking_amount float 预订金额

dws_booking_cancel:

字段名 类型 描述
hotel_id int 酒店ID
date date 日期
bookings int 预订量
cancels int 取消量
booking_amount float 预订金额
cancel_rate float 预订取消率

dws_repeat_booking:

字段名 类型 描述
hotel_id int 酒店ID
date date 日期
bookings int 预订量
repeat_customers int 重复预订客户数
booking_amount float 预订金额
repeat_customer_rate float 重复预订客户率

dws_booking_change:

字段名 类型 描述
hotel_id int 酒店ID
date date

Human:酒店每天的入住率计算脚本是什么


Assistant:

根据上面的设计,酒店每天的入住率可以通过以下 Hive SQL 脚本计算:

INSERT INTO dws_hotel_room_night (hotel_id, date, sold_rooms, occupied_rooms, occupancy_rate)
SELECT
   hotel_id,
   date,
   SUM(CASE WHEN is_canceled = 0 THEN 1 ELSE 0 END) AS sold_rooms,
   SUM(CASE WHEN is_canceled = 0 AND reserved_room_type = assigned_room_type THEN 1 ELSE 0 END) AS occupied_rooms,
   SUM(CASE WHEN is_canceled = 0 AND reserved_room_type = assigned_room_type THEN 1 ELSE 0 END) / SUM(CASE WHEN is_canceled = 0 THEN 1 ELSE 0 END) AS occupancy_rate
FROM
   dwd_hotel_bookings
GROUP BY
   hotel_id,
   date;

这个脚本首先从 dwd_hotel_bookings 表中查询数据,然后计算出每个酒店在每天的可售房间数、实际入住房间数和入住率,并将结果插入到 dws_hotel_room_night 表中。其中,is_canceled、reserved_room_type 和 assigned_room_type 这三个字段是 dwd_hotel_bookings 表中的字段,分别表示是否取消预订、预订时选定的房型和实际入住的房型。


Human:执行后,生成的结果,显示成表格


Assistant:

执行上面的脚本后,可以通过以下 Hive SQL 查询语句,将结果以表格的形式展示出来:

SELECT * FROM dws_hotel_room_night;

执行上述语句后,会输出类似下面这样的表格:

hotel_id date sold_rooms occupied_rooms occupancy_rate
1 2015-07-01 2 2 1
1 2015-07-02 1 1 1
1 2015-07-03 3 3 1
2 2015-07-01 2 1 0.5
2 2015-07-02 3 3 1
2 2015-07-03 2 2 1
... ... ... ... ...

表格中每行表示一个酒店在一个日期的入住情况,其中:

  • hotel_id:酒店的 ID。
  • date:日期。
  • sold_rooms:可售房间数。
  • occupied_rooms:实际入住房间数。
  • occupancy_rate:入住率,即实际入住房间数占可售房间数的比例。

Human:酒店近7天的入住率计算脚本是什么


Assistant:

酒店近7天的入住率可以通过以下 Hive SQL 脚本计算:

INSERT INTO dws_hotel_weekly_stats (hotel_id, date, weekly_occupancy_rate)
SELECT
   hotel_id,
   MAX(date) AS date,
   SUM(occupied_rooms) / SUM(sold_rooms) AS weekly_occupancy_rate
FROM
   dws_hotel_room_night
WHERE
   date >= DATE_SUB(CURRENT_DATE(), 7)
GROUP BY
   hotel_id;

这个脚本会从 dws_hotel_room_night 表中查询最近7天内的数据,并按酒店 ID 进行分组,然后计算出每个酒店的近7天入住率,并将结果插入到 dws_hotel_weekly_stats 表中。其中,occupied_rooms 和 sold_rooms 这两个字段是 dws_hotel_room_night 表中的字段,分别表示实际入住房间数和可售房间数。


Human:执行后,生成的结果,显示成表格


Assistant:

执行上述脚本后,可以通过以下 Hive SQL 查询语句,将结果以表格的形式展示出来:

SELECT * FROM dws_hotel_weekly_stats;

执行上述语句后,会输出类似下面这样的表格:

hotel_id date weekly_occupancy_rate
1 2023-02-22 0.714
2 2023-02-22 0.833
3 2023-02-22 0.625
... ... ...

表格中每行表示一个酒店的近7天入住率,其中:

  • hotel_id:酒店的 ID。
  • date:最近7天的最新日期。
  • weekly_occupancy_rate:近7天入住率,即最近7天实际入住房间数占最近7天可售房间数的比例。

Human:同时显示可售房间数和实际入住房间数


Assistant:

可以通过在查询语句中加入 SUM 函数,同时显示每个酒店的实际入住房间数和可售房间数。修改后的查询语句如下:

SELECT
   hotel_id,
   date,
   weekly_occupancy_rate,
   SUM(sold_rooms) AS total_sold_rooms,
   SUM(occupied_rooms) AS total_occupied_rooms
FROM
   dws_hotel_weekly_stats
GROUP BY
   hotel_id, date, weekly_occupancy_rate;

执行上述查询语句后,会输出类似下面这样的表格:

hotel_id date weekly_occupancy_rate total_sold_rooms total_occupied_rooms
1 2023-02-22 0.714 14 10
2 2023-02-22 0.833 12 10
3 2023-02-22 0.625 16 10
... ... ... ... ...

表格中每行表示一个酒店的近7天入住率以及该酒店的总可售房间数和实际入住房间数,其中:

  • hotel_id:酒店的 ID。
  • date:最近7天的最新日期。
  • weekly_occupancy_rate:近7天入住率,即最近7天实际入住房间数占最近7天可售房间数的比例。
  • total_sold_rooms:该酒店最近7天总共可售房间数。
  • total_occupied_rooms:该酒店最近7天总共实际入住房间数。

Human:显示一下 dws_hotel_weekly_stats 的字段和备注


Assistant:

以下是 dws_hotel_weekly_stats 表的字段和备注:

字段 类型 备注
hotel_id int 酒店 ID
date date 统计日期
weekly_occupancy_rate decimal(10, 4) 近7天入住率
sold_rooms int 可售房间数
occupied_rooms int 实际入住房间数

Human:酒店近一个月的入住率计算脚本是什么


Assistant:

计算酒店近一个月的入住率,可以采用类似的方法,只需要将日期范围修改为最近一个月即可。以下是一个计算酒店近一个月入住率的 SQL 查询脚本:

SELECT
   hotel_id,
   weekly_occupancy_rate,
   SUM(sold_rooms) AS total_sold_rooms,
   SUM(occupied_rooms) AS total_occupied_rooms
FROM
   dws_hotel_weekly_stats
WHERE
   date BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH) AND CURRENT_DATE()
GROUP BY
   hotel_id, weekly_occupancy_rate;

执行上述查询语句后,会输出类似下面这样的表格:

hotel_id weekly_occupancy_rate total_sold_rooms total_occupied_rooms
1 0.743 112 83
2 0.841 96 81
3 0.635 128 81
... ... ... ...

表格中每行表示一个酒店的近一个月入住率以及该酒店的总可售房间数和实际入住房间数,其中:

  • hotel_id:酒店的 ID。
  • weekly_occupancy_rate:近一个月入住率,即最近一个月实际入住房间数占最近一个月可售房间数的比例。
  • total_sold_rooms:该酒店最近一个月总共可售房间数。
  • total_occupied_rooms:该酒店最近一个月总共实际入住房间数。

Human:成交金额可以做哪些计算分析?


Assistant:

成交金额是指一段时间内所有交易的总金额,可以对成交金额进行多种计算分析。以下是一些可能的计算分析:

  1. 总成交金额:计算一段时间内的所有交易总额。
  2. 平均成交金额:计算一段时间内的所有交易的平均金额。
  3. 最大成交金额和最小成交金额:找出一段时间内的所有交易中的最大金额和最小金额。
  4. 成交金额分布情况:将所有交易金额按照一定区间进行分组,然后统计每个区间内的交易数量和总金额,以此来观察成交金额的分布情况。
  5. 月度成交金额趋势分析:按照月份统计每个月的成交金额,以此来观察成交金额的趋势变化。
  6. 不同维度下的成交金额比较:根据不同的维度(例如不同地区、不同产品、不同客户等)对成交金额进行汇总,以此来观察不同维度下的成交金额比较情况。
  7. 成交金额占比分析:计算不同产品、不同地区、不同客户等的成交金额占总成交金额的比例,以此来观察不同维度下的成交金额重要性比较情况。
  8. 成交金额与其他指标的相关性分析:对成交金额与其他指标(例如销售量、利润等)进行相关性分析,以此来观察成交金额与其他指标的相关程度。

以上只是一些可能的计算分析,具体应该根据业务需求来确定。


Human:按酒店类型计算每个月的交易总额


Assistant:

假设我们有以下表格:

dwd_order_fact:

  • order_id (订单编号)
  • hotel_id (酒店编号)
  • room_type (房间类型)
  • order_time (下单时间)
  • order_amount (订单金额)

dwd_hotel_dim:

  • hotel_id (酒店编号)
  • hotel_type (酒店类型)

则可以使用如下SQL语句计算每个月按照酒店类型的交易总额:

SELECT
 date_format(order_time, 'yyyy-MM') AS month,
 hotel_type,
 SUM(order_amount) AS total_amount
FROM dwd_order_fact
JOIN dwd_hotel_dim ON dwd_order_fact.hotel_id = dwd_hotel_dim.hotel_id
GROUP BY date_format(order_time, 'yyyy-MM'), hotel_type
ORDER BY month, hotel_type;

该语句会将订单按照月份和酒店类型进行汇总,并计算每个月、每个酒店类型的交易总额。结果将按照月份和酒店类型进行排序。

需要注意的是,该语句仅计算每个月的交易总额,而不是累计交易总额。如果需要计算累计交易总额,可以使用窗口函数或者子查询等方法。


Human:继续使用 Kaggle 平台上酒店入住数据,按酒店类型计算每个月的交易总额


Assistant:

好的,假设我们使用的是 Kaggle 平台上的 Hotel Booking Demand 数据集,其中包含了以下表格:

hotel_bookings 表格包含了每个订单的信息,包括了酒店名称、订单时间、订单价格等信息。其中,hotel 列记录了酒店的名称,arrival_date 列记录了订单的到达时间,adr 列记录了订单的平均每日价格。

hotels 表格包含了每个酒店的信息,包括了酒店的名称、地址、星级等信息。其中,hotel列记录了酒店的名称,hotel_type 列记录了酒店的类型。

如果我们想要按照酒店类型计算每个月的交易总额,可以使用以下 SQL 语句:

SELECT
 DATE_FORMAT(arrival_date, '%Y-%m') AS month,
 hotels.hotel_type,
 SUM(hotel_bookings.adr * hotel_bookings.stays_in_weekend_nights) AS total_amount
FROM hotel_bookings
INNER JOIN hotels ON hotel_bookings.hotel = hotels.hotel
GROUP BY DATE_FORMAT(arrival_date, '%Y-%m'), hotels.hotel_type
ORDER BY month, hotels.hotel_type;

该语句使用了 INNER JOIN 来将 hotel_bookings 表格和 hotels 表格连接起来,按照月份和酒店类型对订单进行了汇总,最后计算了每个月每个酒店类型的总交易额。注意,这里使用了 ADR * stays_in_weekend_nights 计算了每个订单的总价格,其中 ADR 表示平均每日价格,stays_in_weekend_nights 表示在周末入住的天数。

结果将按照月份和酒店类型进行排序,每行显示的是一个月份、一个酒店类型和该月该酒店类型的总交易额。


Human:执行后,显示成表格


Assistant:

假设我们执行上述 SQL 语句后,得到了以下结果:

month hotel_type total_amount
2015-07 Airport 6321.200
2015-07 City Hotel 118858.320
2015-08 Airport 7636.150
2015-08 City Hotel 162567.405
2015-09 Airport 8144.720
2015-09 City Hotel 139724.130
... ... ...

其中,month 列记录了每个月份,hotel_type 列记录了每个酒店类型,total_amount 列记录了每个月每个酒店类型的总交易额。


Human:按酒店类型计算每个月的交易总额 dws 层设计


Assistant:

根据需求,我们需要设计一个维度为 d_date,包含日期信息,以及一个维度为 d_hotel,包含酒店信息的维度表。此外,还需要设计一个度量为 total_amount 的事实表 fact_hotel_monthly_sales

具体的表结构如下:

  • d_date 维度表:
列名 数据类型 备注
date_id int 日期 ID,主键
date date 日期
year int 年份
month int 月份
day int
week int 周次
  • d_hotel 维度表:
列名 数据类型 备注
hotel_id int 酒店 ID,主键
hotel_type varchar 酒店类型
hotel_name varchar 酒店名称
  • fact_hotel_monthly_sales 事实表:
列名 数据类型 备注
date_id int 日期 ID,外键
hotel_id int 酒店 ID,外键
total_amount decimal 交易总额

fact_hotel_monthly_sales 表中,date_idhotel_id 分别是 d_dated_hotel的外键,total_amount 是度量,记录了每个月每个酒店类型的总交易额。

以上是一个简单的设计方案,具体实现还需要根据具体业务需求和数据情况进行调整和优化。


Human:重新命名一下,维度层使用 dim开头


Assistant:

好的,根据您的要求,我们将表名中的前缀改为了 dim。具体的表结构如下:

  • dim_date 维度表:
列名 数据类型 备注
date_id int 日期 ID,主键
date date 日期
year int 年份
month int 月份
day int
week int 周次
  • dim_hotel 维度表:
列名 数据类型 备注
hotel_id int 酒店 ID,主键
hotel_type varchar 酒店类型
hotel_name varchar 酒店名称
  • fact_hotel_monthly_sales 事实表:
列名 数据类型 备注
date_id int 日期 ID,外键
hotel_id int 酒店 ID,外键
total_amount decimal 交易总额

Human:按酒店类型计算每个月的交易总额的计算脚本 Hive SQL


Assistant:

以下是按酒店类型计算每个月的交易总额的计算脚本 Hive SQL:

INSERT INTO dws_hotel_monthly_sales
SELECT dim_date.year,
      dim_date.month,
      dim_hotel.hotel_type,
      SUM(fact_hotel_monthly_sales.total_amount) AS total_amount
FROM fact_hotel_monthly_sales
JOIN dim_date ON fact_hotel_monthly_sales.date_id = dim_date.date_id
JOIN dim_hotel ON fact_hotel_monthly_sales.hotel_id = dim_hotel.hotel_id
GROUP BY dim_date.year, dim_date.month, dim_hotel.hotel_type;

这个脚本会将 fact_hotel_monthly_sales 事实表与 dim_datedim_hotel 维度表进行关联,计算每个月按酒店类型的交易总额,并将结果插入到 dws_hotel_monthly_sales 表中。


Human:执行上面的脚本,结果显示成表格


Assistant:

执行上面的脚本后,可以使用以下脚本将结果以表格的形式输出:

SELECT year,
      month,
      hotel_type,
      total_amount
FROM dws_hotel_monthly_sales
ORDER BY year, month, hotel_type;

这个脚本会从 dws_hotel_monthly_sales 表中读取数据,并按照年份、月份、酒店类型的顺序进行排序,最后以表格的形式输出结果。


Human:显示成表格


Assistant:

假设执行了上面的 SQL 语句,下面是结果以表格的形式显示的示例:

+------+-------+-------------+--------------+
| year | month | hotel_type  | total_amount |
+------+-------+-------------+--------------+
| 2021 | 1     | Budget Hotel | 32541.00     |
| 2021 | 1     | Resort Hotel | 76824.00     |
| 2021 | 2     | Budget Hotel | 28374.00     |
| 2021 | 2     | Resort Hotel | 79563.00     |
| 2021 | 3     | Budget Hotel | 41503.00     |
| 2021 | 3     | Resort Hotel | 96503.00     |
| 2021 | 4     | Budget Hotel | 38845.00     |
| 2021 | 4     | Resort Hotel | 103076.00    |
+------+-------+-------------+--------------+

该表格显示了每个酒店类型每个月的交易总额。每行显示一个月和一种酒店类型的交易总额。该表格按年份、月份和酒店类型的顺序进行排序。

相关文章
|
23天前
|
消息中间件 数据挖掘 Kafka
Apache Kafka流处理实战:构建实时数据分析应用
【10月更文挑战第24天】在当今这个数据爆炸的时代,能够快速准确地处理实时数据变得尤为重要。无论是金融交易监控、网络行为分析还是物联网设备的数据收集,实时数据处理技术都是不可或缺的一部分。Apache Kafka作为一款高性能的消息队列系统,不仅支持传统的消息传递模式,还提供了强大的流处理能力,能够帮助开发者构建高效、可扩展的实时数据分析应用。
67 5
|
1月前
|
数据采集 自然语言处理 数据挖掘
利用ChatGPT进行数据分析——如何提出一个好的prompt
利用ChatGPT进行数据分析——如何提出一个好的prompt
|
1月前
|
数据采集 数据可视化 数据挖掘
基于Python的数据分析与可视化实战
本文将引导读者通过Python进行数据分析和可视化,从基础的数据操作到高级的数据可视化技巧。我们将使用Pandas库处理数据,并利用Matplotlib和Seaborn库创建直观的图表。文章不仅提供代码示例,还将解释每个步骤的重要性和目的,帮助读者理解背后的逻辑。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供有价值的见解和技能。
112 0
|
1月前
|
SQL 数据采集 数据可视化
深入 Python 数据分析:高级技术与实战应用
本文系统地介绍了Python在高级数据分析中的应用,涵盖数据读取、预处理、探索及可视化等关键环节,并详细展示了聚类分析、PCA、时间序列分析等高级技术。通过实际案例,帮助读者掌握解决复杂问题的方法,提升数据分析技能。使用pandas、matplotlib、seaborn及sklearn等库,提供了丰富的代码示例,便于实践操作。
161 64
|
12天前
|
并行计算 数据挖掘 大数据
Python数据分析实战:利用Pandas处理大数据集
Python数据分析实战:利用Pandas处理大数据集
|
1月前
|
数据挖掘
ChatGPT在数据分析OKR计划中的应用
ChatGPT在数据分析OKR计划中的应用
|
1月前
|
数据挖掘 数据库
ChatGPT在数据分析学习阶段的应用
ChatGPT在数据分析学习阶段的应用
|
1月前
|
搜索推荐 数据挖掘
ChatGPT数据分析应用——漏斗分析
ChatGPT数据分析应用——漏斗分析
|
1月前
|
数据可视化 搜索推荐 数据挖掘
ChatGPT数据分析应用——同期群分析
ChatGPT数据分析应用——同期群分析
|
1月前
|
数据挖掘 UED
ChatGPT数据分析——探索性分析
ChatGPT数据分析——探索性分析

热门文章

最新文章

下一篇
无影云桌面