从零开始搭建CDH-第十二章

一、安装spark服务

停止部分服务

在开始安装spark服务之前,我们需要关闭部分服务,因为我们是单独的笔记本并不是真实的计算机集群,可能出现内存不够的情况,我们选择关闭hbase和phoenix服务。

添加服务

配置hive

在主页面点击hive进入hive后点击配置,在搜索框中输入hive.execution.engine

接着继续输入Spark on YARN

保存更改。

重启配置

出现提示符号需要重启的服务都重启,跟前一章一样。

二、使用Spark处理Hive数据

回到虚拟机,执行以下命令启动spark:

复制代码
spark-shell \
  --master yarn \
  --deploy-mode client \
  --driver-memory 512m \
  --executor-memory 512m \
  --executor-cores 1 \
  --num-executors 2 \
  --conf spark.executor.memoryOverhead=128

接下来依次执行命令即可:

import org.apache.spark.sql.hive.HiveContext

import org.apache.spark.sql.{SQLContext, Row}

import org.apache.spark.sql.types._

import org.apache.spark.sql.functions._

val struct_tab = spark.sql("select ip, userinfo from struct_tab")

struct_tab.show(false)

val array_tab = spark.sql("select name, work_locations from array_tab")

array_tab.show(false)

val res1=array_tab.withColumn("tag_len", size(col("work_locations")))

res1.show()

val map_tab = spark.sql("select id, name,members from map_tab")

map_tab.show(false)

三、pyspark处理文本数据

点击以下网址进入下载页面选择ml-100k.zip进行下载

https://files.grouplens.org/datasets/movielens/

下载并解压好后我们进入Hue服务

然后创建hdfs的movie目录将文件u.data导入到该目录下

移动到左上角的三条杠那里,点击文件

右上角新建目录。

进入movie目录,点击加号上传文件。

找到解压的文件并上传,可以直接拖拽,我这里为了演示采用加号上传。

接下来回到虚拟机,启动PySpark(YARN模式)

pyspark \

--master yarn \

--deploy-mode client \

--driver-memory 512m \

--executor-memory 512m \

--conf spark.executor.memoryOverhead=128

然后依次执行:

复制代码
from pyspark.sql import SparkSession, functions as F
from pyspark.sql.types import *

ss = SparkSession.builder.getOrCreate()
sc = ss.sparkContext

# 读取 HDFS 上的文件
rdd = sc.textFile('/movie')

# 解析数据(注意分隔符是 \t)
rdd_map = rdd.map(lambda x: x.split('\t')).map(lambda arr: (arr[0], arr[1], int(arr[2]), arr[3]))

# 定义 schema
schema = StructType([
    StructField("user_id", StringType()),
    StructField("movie_id", StringType()),
    StructField("score", IntegerType()),
    StructField("date_time", StringType())
])

df = rdd_map.toDF(schema)
df.show(5)

# 1. 每个用户的平均分
df.groupBy("user_id").agg(F.avg("score").alias("avg_score")).show()

# 2. 每个电影的平均分
df.groupBy("movie_id").agg(F.avg("score").alias("avg_score")).show(30)

# 3. 查询大于平均分的电影数量
avg_total = df.select(F.avg("score")).first()[0]
movie_avg = df.groupBy("movie_id").agg(F.avg("score").alias("avg_score"))
high_movies = movie_avg.filter(movie_avg["avg_score"] > avg_total)
print("大于平均分的电影数量:", high_movies.count())

# 4. 高分电影(>3)打分次数最多的用户,及其平均分
high_score_user = df.filter(df["score"] > 3) \
                   .groupBy("user_id") \
                   .agg(F.count("user_id").alias("cnt")) \
                   .orderBy(F.desc("cnt")) \
                   .first()
user_id = high_score_user["user_id"]
print("打分次数最多的用户:", user_id)
user_avg = df.filter(df["user_id"] == user_id).select(F.avg("score")).first()[0]
print("该用户的平均分:", user_avg)

# 5. 每个用户的平均分、最低分、最高分
df.groupBy("user_id").agg(
    F.avg("score").alias("avg_score"),
    F.min("score").alias("min_score"),
    F.max("score").alias("max_score")
).show()

# 6. 被评分超过100次的电影,平均分 TOP10
df.groupBy("movie_id").agg(
    F.count("movie_id").alias("cnt"),
    F.avg("score").alias("avg_score")
).filter(F.col("cnt") > 100) \
 .orderBy(F.desc("avg_score")) \
 .limit(10) \
 .show()

如果觉得一行一行执行太麻烦可以将所有代码打包成.py文件,然后使用spark-submit提交:

复制代码
spark-submit \
  --master yarn \
  --deploy-mode client \
  --driver-memory 512m \
  --executor-memory 512m \
  --conf spark.executor.memoryOverhead=128 \
  your_job.py

这里就不演示了。

相关推荐
~黄夫人~4 小时前
零基础速通|Windows&Linux 常用命令行对照表大全
linux·运维·windows·笔记·备忘录·整理表格
benjiangliu4 小时前
LINUX系统-17-EXT系列文件系统(二)
linux·运维·服务器
杨云龙UP4 小时前
Linux 根分区被日志吃满?一次 58G Broker 日志清理实战_2026-05-20
linux·运维·服务器·数据库·hdfs·apache
叶半欲缺5 小时前
Linux通过lvm扩容根目录
linux·运维·服务器
utf8mb4安全女神5 小时前
Linux网络服务
linux·运维·服务器
vortex56 小时前
Linux PAM 配置详解:从原理到实战,彻底阻断非授权提权
java·linux·服务器
ZPC82106 小时前
Linux Preempt-RT 实时内核 ** 抖动(Jitter)** 完整测试方法
linux·运维·服务器
2501_920047036 小时前
openclaw在ubuntu系统的安装
linux·运维·ubuntu·openclaw
一个人旅程~7 小时前
linux如何“抢”过windows的usb移动硬盘权限对0磁道损坏的移动硬盘进行尝试修复
linux·windows·经验分享·电脑