spark - 小实践(2)dataset实战

本文通过Spark 2.2版本的API介绍了一系列数据处理技巧,包括JSON数据读取、DataFrame操作、聚合函数使用等,特别关注了版本更新带来的API变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

     spark官方example文件夹中提供了people.json的一份测试数据,并结合官方dataset使用方式的介绍,我们可以做一些练习,准备好的数据可以到这里下载:https://download.youkuaiyun.com/download/u013560925/10342251。

     数据json读取时候的dataframe格式如下:

     people.json:对应用户姓名和年龄

     peopleScore.json: 对应用户的姓名和分数


 !!之前使用的2.1的api,现在转为了较新的2.2的api,注意!在此说明spark和sql相关版本信息如下,如果版本不一致,api的使用方式会有所出入:         

<dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>2.2.0</version>
        </dependency>
    <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.11</artifactId>
            <version>2.2.0</version>
            <scope>compile</scope>
    </dependency>

正文

        本次涉及练习的api方法有:joinwith、groupBy、countDistinct、agg、sample、sort、dropDuplicates、join、mapPartition

       dataset是强类型的数据集合,所以在很多时候都需要as[Int]等操作来生命数据类型,这是dataframe所不需要的。

0. 相关初始化和导入准备

初始化:

val spark = SparkSession
      .builder()
      .appName("Spark Hive Example")
      .config("spark.sql.warehouse.dir", warehouseLocation)
      .enableHiveSupport()
      .getOrCreate()
       //注意要单独引入以下引用包!!!!
      import  spark.implicits._     //隐式转换
      import org.apache.spark.sql.functions._     //agg内置算法

1. joinWith

2.1 spark版本的条件是可以直接用字符串的,比如($"name"===$"n"),在2.2版本中就必须列来表示。

personsDS.joinWith(personScoresDS,personsDS("name")===personScoresDS("n")).show


2. groupBy+countDistinct

注意as[Int]、as[String],注意使用agg(sum) 需要引入之前所说的依赖
personsDS.groupBy("name").agg(sum("age").as[Int],countDistinct("age").as[Int],current_date().as[String]).show()

3. agg

personsDS.groupBy("name").agg(collect_list("name").as[String],collect_set("age").as[Int])

4. sample

运行三次,每一次的随机抽取的数据都不一样

personsDS.sample(false,0.5).show()

5. sort

  personsDS.sort("age").show()

6. dropDuplicates

 personsDS.dropDuplicates("name").show
    

6. join

personsDS.join(personScoresDS,personsDS("name")===personScoresDS("n")).show


7. mapPartition

def doubleFunc(iter: Iterator[Person]) : Iterator[(String,Long)] = {
      var res = ArrayBuffer[(String,Long)]()
      while (iter.hasNext)
      {
        val cur = iter.next;
        res+=((cur.name,cur.age+1000))
      }
      res.iterator
    }
      personsDS.mapPartitions(doubleFunc)


结论

1.spark core和sql版本很重要,版本不同api使用方式不同

2.使用官方javadoc查看api使用方式,对应版本查询

3.百度得到的方法,很可能因为版本不一样而无法使用

### 使用Spark进行酒店数据分析的企业实战案例 在企业实践中,使用Spark进行酒店数据分析的案例并不少见。以下是一个基于提供的引用内容以及相关知识的详细分析。 #### 1. 酒店数据分析与推荐系统 一个典型的案例是基于PySpark的大规模酒店数据分析与推荐系统[^2]。该系统通过抓取和处理酒店的历史数据,对价格、评分、类型和城市等多个维度进行了深入分析。通过对这些数据的清洗和预处理,系统能够揭示市场趋势,并为后续决策提供支持。例如,探索性分析揭示了价格波动、评分分布和用户偏好等关键信息。 #### 2. 数据处理与机器学习结合 在数据处理阶段,系统利用PySpark的强大功能对大规模数据进行高效处理。同时,结合机器学习算法(如协同过滤)进行个性化推荐[^2]。这种技术组合不仅提升了用户体验,还帮助酒店行业更好地理解客户需求,优化营销策略。 #### 3. 数据可视化 为了使分析结果更加直观,系统采用了ECharts进行数据可视化[^2]。通过生成酒店价格、评分和类型的图表,以及词云图,用户可以快速了解市场表现和客户关注热点。这种可视化的呈现方式对于非技术背景的业务人员尤为重要。 #### 4. Spark运行架构与原理 从技术角度来看,Spark的运行架构和原理为其在酒店数据分析中的应用提供了坚实基础[^3]。Spark Core的任务划分与调度机制确保了大规模数据处理的高效性,而RDD、DataFrame和Dataset等数据抽象模块则简化了数据操作流程。此外,Cluster Manager和DAG调度器的工作原理进一步优化了资源管理和任务执行效率。 #### 5. 实战经验分享 在实际项目中,企业通常会遇到数据质量问题、性能瓶颈和技术选型挑战。以下是一些实践经验: - **数据质量**:确保数据的准确性和一致性是数据分析成功的关键。可以通过数据清洗和预处理步骤来解决这些问题。 - **性能优化**:针对大规模数据集,合理配置Spark参数(如分区数、内存分配)可以显著提升性能。 - **技术选型**:根据具体需求选择合适的工具和技术栈。例如,PySpark适合Python开发者,而Scala更适合需要高性能的场景。 ```python # 示例代码:使用PySpark进行酒店数据处理 from pyspark.sql import SparkSession # 初始化SparkSession spark = SparkSession.builder.appName("HotelDataAnalysis").getOrCreate() # 加载酒店数据 hotel_data = spark.read.csv("hotel_data.csv", header=True, inferSchema=True) # 数据清洗与预处理 cleaned_data = hotel_data.filter(hotel_data.price > 0).na.drop() # 基本统计分析 price_stats = cleaned_data.selectExpr("avg(price) as avg_price", "stddev(price) as std_price") # 输出结果 price_stats.show() ``` ### 结论 通过上述案例可以看出,Spark在酒店数据分析领域具有广泛的应用前景。它不仅能够高效处理大规模数据,还能结合机器学习算法实现个性化推荐,为企业决策提供有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值