hive数仓开发之-数据表

本文介绍了Hive数仓中内部表和外部表的区别,包括它们在HDFS上的存储格式,如ORC和Parquet。讨论了分区和分桶策略,强调动态分区和静态分区的使用场景,并提到了外部表在临时分析计算中的作用。建议在建表时考虑优化方案,如选择适当的分区和存储格式。

建表

在数仓里,数据表可以分为内部表和外部表。内部表和外部表的区别是内部表的数据存储是在当前用户所在的hdfs目录下,而外部表则不是。

  1. 内部表和外部表

内部表在hdfs上的常见文件存储格式有 textfile,orc,rc,pqrquet 等存储格式,每种格式的优劣这里先不做具体展开,项目上基于性能和存储考虑,一般选择orc 或者是parquet,o确切来说orc比parquet更省存储,性能差不多。如果是考虑后续更换计算引擎(比如说是spark,或者是impala) 那还是选用parquet 更适合一点(扩展性更强)。

  1. 分区分桶

这种策略是在应对数据量较大的情况下采用的。
分区可以是一级分区,二级分区,乃至三级分区(example:天-小时-分钟)。

hive表的表名在hdfs上实际是一个文件目录,分区只是文件目录下的子目录而已

在这里插入图片描述
分区也分为动态分区和静态分区,静态分区的是往hive表的某一个固定分区写入数据,而动态的则是根据分区字段的值写入对应的分区,所以当选择动态分区的时候,要看下参数有无打开,或者是
在sql之前执行以下脚本

set hive.exec.dynamic.partition=true; set
hive.exec.max.dynamic.partitions=2000;

打开动态分区开关,设置最大动态分区数为2000.具体2000 还是300 还是1000 根据具体场景设计。

  1. 分桶

对Hive(Inceptor)表分桶可以将表中记录按分桶键的哈希值分散进多个文

### 使用 Hive 数据仓库和 Spark 构建医疗病例大据分析与预测系统 #### 设计架构概述 为了实现高效的据处理和复杂模式识别,在设计基于Hive数据仓库和Spark的大据分析与预测系统时,需考虑以下几个方面: - **据采集层**:负责收集来自不同源的原始医疗记录,包括但不限于电子病历(EMR)、实验室测试结果和其他健康监测设备产生的日志文件。 - **存储管理层**:采用Hive作为主要的储解决方案来管理和组织这些海量异构型态的信息。由于Hive支持多种接口形式[^3],这使得应用程序能够灵活接入。 - **计算引擎层**:利用Apache Spark强大的分布式内存内运算能力来进行快速迭代训练以及实时流式处理任务。对于复杂的机器学习工作负载而言尤为适合。 - **服务提供层**:最终形成的服务可以是APIs供其他业务逻辑调用,或是直接面向用户的可视化仪表板展示分析成果。 #### 实现步骤详解 ##### 创建表结构并加载初始据集到Hive中 定义好目标表格字段及其属性之后,可以通过如下方式创建一张新表用于保存患者基本信息: ```sql CREATE TABLE IF NOT EXISTS patients ( patient_id STRING, name STRING, gender STRING, birthdate DATE, address STRING, phone_number STRING ); ``` 接着把预处理后的CSV格式文档导入进来填充该表的内容: ```bash LOAD DATA LOCAL INPATH '/path/to/patient_data.csv' INTO TABLE patients; ``` ##### 配置连接器使Spark能读取写入Hive里的资料 为了让两个组件之间顺畅协作,需要配置`spark-defaults.conf`文件指定hive-site.xml的位置以便于获取必要的元据信息: ```properties spark.sql.warehouse.dir=hdfs://namenode:8020/user/hive/warehouse/ spark.hadoop.hive.metastore.uris=thrift://metastore_host:9083 ``` 随后便可在PySpark脚本里轻松操作上述已建立好的patients表了: ```python from pyspark.sql import SparkSession spark = (SparkSession.builder.appName("MedicalAnalysis") .config("spark.jars.packages", "org.apache.spark:spark-hive_2.12:3.1.1") .enableHiveSupport() .getOrCreate()) df_patients = spark.table('default.patients') print((f"Total number of records in 'patients': {df_patients.count()}")) ``` ##### 开发预测模型并对未知样本做出推断 假设现在要开发一个简单的线性回归模型去估计某项生理指标的变化趋势,则可按照下面流程执行: ```python from pyspark.ml.feature import VectorAssembler from pyspark.ml.regression import LinearRegression # 假设我们有一个包含历史测量值的时间序列据框 df_measurements assembler = VectorAssembler(inputCols=["age"], outputCol="features") lr = LinearRegression(featuresCol='features', labelCol='measurement_value') pipeline = Pipeline(stages=[assembler, lr]) model = pipeline.fit(df_measurements) predictions = model.transform(new_samples_df) ``` 通过这种方式不仅可以完成基础统计汇总报表生成功能,还具备了一定程度上的智能化决策辅助作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值