当前位置: 首页 > web >正文

Spark-SQL编程

1. Spark-SQL连接Hive

 连接方式概述:Spark SQL编译时可选择包含Hive支持,包含后能支持Hive表访问、UDF、HQL等功能,且无需事先安装Hive。连接方式有内嵌Hive、外部Hive、Spark-SQL CLI、Spark beeline及代码操作。

 具体连接方式

 内嵌Hive:使用时无需额外操作,但实际生产中很少使用。

 外部Hive:在spark-shell中连接外部Hive,需拷贝hive-site.xml到conf/目录并修改连接地址,将MySQL驱动拷贝到jars/目录,拷贝core-site.xml和hdfs-site.xml到conf/目录,最后重启spark-shell。

 Spark beeline:Spark Thrift Server兼容HiveServer2,可使用hive的beeline访问。连接步骤与连接外部Hive类似,还需启动Thrift Server,再用beeline连接。

 Spark-SQL CLI:可在本地运行Hive元数据服务并执行查询任务。将mysql驱动和hive-site.xml分别放入jars/和conf/目录,运行bin/目录下的spark-sql.cmd即可。

 代码操作Hive:导入spark-hive_2.12和hive-exec依赖,将hive-site.xml拷贝到项目resources目录。代码中创建SparkSession时启用Hive支持,可执行Hive相关操作。若出现权限问题,可设置HADOOP_USER_NAME解决;还可通过配置spark.sql.warehouse.dir指定数据库仓库地址。

 

2. 统计有效数据条数及用户数量最多的前二十个地址

 实验内容:利用Spark-SQL统计有效数据(uid、phone、addr字段均无空值)条数,并找出用户数量最多的前二十个地址。

 数据处理思路:数据为json格式,需用get_json_object函数转换格式后分析处理。

 代码示例(Scala)

 

scala

import org.apache.spark.sql.SparkSession

import org.apache.spark.sql.functions.get_json_object

 

object SparkSQLExperiment {

  def main(args: Array[String]): Unit = {

    val spark = SparkSession.builder()

     .appName("SparkSQLExperiment")

     .master("local[*]")

     .getOrCreate()

 

    // 读取json数据

    val df = spark.read.json("path/to/your/json/data.json")

 

    // 提取字段并过滤有效数据

    val validData = df.select(

      get_json_object($"value", "$.uid").alias("uid"),

      get_json_object($"value", "$.phone").alias("phone"),

      get_json_object($"value", "$.addr").alias("addr")

    ).filter($"uid".isNotNull && $"phone".isNotNull && $"addr".isNotNull)

 

    // 统计有效数据条数

    val validDataCount = validData.count()

    println(s"有效数据条数: $validDataCount")

 

    // 按地址分组统计用户数量并取前二十

    val top20Addrs = validData.groupBy("addr").count().orderBy($"count".desc).limit(20)

    top20Addrs.show()

 

    spark.stop()

  }

}

 

 

http://www.xdnf.cn/news/774.html

相关文章:

  • 【第十六届 蓝桥杯 省 C/Python A/Java C 登山】题解
  • 《Java工程师面试核心突破》专栏简介
  • Uniapp 自定义TabBar + 动态菜单实现教程(Vuex状态管理详解)
  • Docker如何更换镜像源提高拉取速度
  • 【Easylive】为什么需要手动转换 feign.Response 到 HttpServletResponse
  • Itext进行PDF的编辑开发
  • GPU高效利用率实战揭秘:蓝耘元生代VS传统云平台的降维打击
  • Spark,hadoop的组成
  • 大数据学习(109)-Impala 和 Hive 之间的 SQL 差异
  • FPGA 中 XSA、BIT 和 DCP 文件的区别
  • 【现代深度学习技术】循环神经网络05:循环神经网络的从零开始实现
  • 基于Arduino的ESP8266连接OneNET云平台(MQTT协议 物模型)(二)连接云平台
  • 头歌实训之SQL视图的定义与操纵
  • 平方根倒数快速算法
  • 深入理解React中的状态提升(Lifting State Up)
  • 聊透多线程编程-线程互斥与同步-13. C# Mutex类实现线程互斥
  • 级联vs端到端、全双工、轮次检测、方言语种、商业模式…语音 AI 开发者都在关心什么?丨Voice Agent 学习笔记
  • 模型的RAG
  • string类(详解)
  • Semaphore的核心机制
  • Java创建对象的方式
  • 30元一公斤的樱桃甜不甜
  • 顺序表和链表的区别(C语言)
  • win11离线安装donet3.5
  • 分布类相关的可视化图像
  • 1222222
  • 类与对象(中)(详解)
  • 云梦数据平台
  • C++move的作用和原理
  • 2-6-1-1 QNX编程入门之进程和线程(八)