【十】Spark SQL DataFrames概述及基本API操作

DataFrames不是Spark SQL提出的,它早期在R、Python中就有了。原来数据R语言中的DataFrame可以快速转到Spark SQL中来。

Spark RDD API是通过函数式编程模式把大数据中的数据转换成分布式数据集RDD再进行编程。

DataFrames概述

官网介绍

DataSet是一个分布式数据集,它是spark1.6后新增的。

DataFrame是一个以列(列名、列的类型、列值)的形式构成的分布式数据集(RDD with schema。 有schema的RDD,RDD本身只是一个分布式数据集,没有列名、列值、类型的概念),按照列赋予不同的名称。可以把DataFrame看作是关系型数据库中的一张表。DataFrame可以通过一下方式创建:结构化数据文件(json)、hive中的表、其他外部数据源(mysql、no sql)、已经存在的RDD。

使用RDD,java/scala 底层是jvm ,python底层是 python runtime,用不同的语言,性能不一样。

而使用DataFrame ,无论是java/scala/python 都是把他们转成逻辑计划(logic plan)来执行,性能是一样的。

DataFrame基本API操作

项目目录

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.sid.com</groupId>
  <artifactId>sparksqltrain</artifactId>
  <version>1.0-SNAPSHOT</version>
  <inceptionYear>2008</inceptionYear>
  <properties>
    <scala.version>2.11.8</scala.version>
    <spark.version>2.2.0</spark.version>
  </properties>

  <repositories>
    <repository>
      <id>scala-tools.org</id>
      <name>Scala-Tools Maven2 Repository</name>
      <url>http://scala-tools.org/repo-releases</url>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>scala-tools.org</id>
      <name>Scala-Tools Maven2 Repository</name>
      <url>http://scala-tools.org/repo-releases</url>
    </pluginRepository>
  </pluginRepositories>

  <dependencies>
    <!-- scala依赖 -->
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>${scala.version}</version>
    </dependency>
    <!-- spark依赖 -->
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql_2.11</artifactId>
      <version>${spark.version}</version>
    </dependency>
    <!-- hivecontext要用这个依赖-->
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-hive_2.11</artifactId>
      <version>${spark.version}</version>
    </dependency>

    <dependency>
      <groupId>org.spark-project.hive</groupId>
      <artifactId>hive-jdbc</artifactId>
      <version>1.2.1.spark2</version>
    </dependency>

  </dependencies>

  <build>
    <sourceDirectory>src/main/scala</sourceDirectory>
    <testSourceDirectory>src/test/scala</testSourceDirectory>
    <plugins>
      <plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <scalaVersion>${scala.version}</scalaVersion>
          <args>
            <arg>-target:jvm-1.5</arg>
          </args>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <configuration>
          <downloadSources>true</downloadSources>
          <buildcommands>
            <buildcommand>ch.epfl.lamp.sdt.core.scalabuilder</buildcommand>
          </buildcommands>
          <additionalProjectnatures>
            <projectnature>ch.epfl.lamp.sdt.core.scalanature</projectnature>
          </additionalProjectnatures>
          <classpathContainers>
            <classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER</classpathContainer>
            <classpathContainer>ch.epfl.lamp.sdt.launching.SCALA_CONTAINER</classpathContainer>
          </classpathContainers>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <configuration>
          <scalaVersion>${scala.version}</scalaVersion>
        </configuration>
      </plugin>
    </plugins>
  </reporting>
</project>

代码

package com.sid.com

import org.apache.spark.sql.SparkSession

/***
  * DataFrame API基本操作
  */

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

    //Spark SQL的入口点是Spark Session
    val spark = SparkSession.builder().appName("DataFrameApi").master("local[2]").getOrCreate()
    /**
      * Loads input in as a `DataFrame`, for data sources that require a path (e.g. data backed by
      * a local or distributed file system).
      *
      * @since 1.4.0
      */
      //将json文件加载成一个DataFrame
    val peopleDF = spark.read.format("json").load("file:///G:\\desktop\\people.json")
    //打印Schema信息到控制台
    peopleDF.printSchema()

    //展示DataFrame中的记录,默认前20条
    peopleDF.show()

    //查询某列 对应mysql是 select name from t;
    peopleDF.select("name").show()

    //peopleDF.col("name")得到一个Column对象
    //select name,age+10 as age2 from t
    //(peopleDF.col("age")+10).as("age2") 取别名
    peopleDF.select(peopleDF.col("name"),(peopleDF.col("age")+10).as("age2")).show()

    //select * from table where age > 19
    peopleDF.filter(peopleDF.col("age") > 30).show()

    //select age,count(*) from table group by age
    peopleDF.groupBy("age").count().show()

    //select * from t where name = 'sid' or name='lisi'
    peopleDF.filter("name='sid' or name='lisi'").show()

    //select * from t where substr(name,0,1)='s'
    peopleDF.filter("substr(name,0,1)='s'").show()

    //select * from t order by name,age
    peopleDF.sort("name","age").show()

    //select * from t order by name asc,age desc
    peopleDF.sort(peopleDF("name").asc,peopleDF("age").desc).show()

    val peopleDF2 = spark.read.format("json").load("file:///G:\\desktop\\people.json")

    //join里面用3个等号
    //select * from t1 inner join t2 on t1.age = t2.age
    peopleDF.join(peopleDF2,peopleDF.col("age")===peopleDF2.col("age"),"inner").show()


    spark.stop()
  }
}

people.json

{"name":"zhangsan","age":30}
{"name":"lisi","age":31}
{"name":"wangwu","age":32}
{"name":"sid","age":32}

运行结果

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1. Spark SQL RDD基本操作Spark SQL RDD是一种分布式数据集,可以通过Spark SQL API进行操作基本操作包括创建RDD、转换RDD、持久化RDD、计算RDD等。可以使用Spark SQL RDD API中的函数进行操作,如map、filter、reduce等。 2. RDD-DataFrame:RDD和DataFrameSpark SQL中的两种数据结构。RDD是弹性分布式数据集,而DataFrame是一种结构化数据集。可以通过将RDD转换为DataFrame来进行数据分析和处理。可以使用Spark SQL中的API将RDD转换为DataFrame,如toDF、createDataFrame等。 3. API MySQLAPI MySQL是一种用于访问MySQL数据库的应用程序接口。可以使用API MySQL来连接MySQL数据库并进行数据操作,如查询、插入、更新、删除等。在Spark SQL中,可以使用API MySQL来读取和写入MySQL数据库中的数据。可以使用Spark SQL中的API来连接MySQL数据库,如JDBC、ODBC等。 ### 回答2: Spark SQL中RDD是一种基础数据结构,它是Resilient Distributed Dataset的简称,即弹性分布式数据集。RDD具有不可变性、分区性和良好的容错性,可以通过多种方式创建。RDD的基本操作包括转换操作和行动操作。转换操作是指基于源数据生成一个新的RDD,而不改变源数据。常见的转换操作包括map、filter和reduceByKey等。行动操作是指触发数据的计算并返回结果。常见的行动操作包括collect、count和reduce等。RDD的优势在于能够在内存中处理海量数据,提高处理速度和效率。 RDD与DataFrameSpark SQL的两种核心数据结构。DataFrame是一个二维表格式的数据集合,可以通过多种方式创建,包括从RDD转换而来、读取外部数据源等。与RDD相比,DataFrame有更丰富的API支持和更高的性能优化,同时也提供SQL查询等类似于关系型数据库的操作DataFrame基本操作包括列选择、过滤、聚合等。 在使用Spark SQL时,还需要连接外部数据源进行数据读取和写入。常见的外部数据源包括MySQL等关系型数据库。Spark SQL可以通过多种方式连接MySQL,包括使用JDBC和使用DataFrame API。使用JDBC需要在代码中明确连接MySQL的URL、用户名和密码等信息,使用DataFrame API可以通过定义schema和指定数据源路径等方式进行数据读取和写入。连接MySQL需要注意代码的安全性和性能问题。 综上所述,Spark SQL中RDD、DataFrame和连接外部数据源的API都是使用Spark进行大数据处理的重要组成部分。熟练掌握这些基本操作API可以提高数据分析和处理的效率和可靠性。 ### 回答3: Spark SQL RDD基本操作Spark SQL中,RDD操作是非常基础且非常重要的。Spark SQL RDD的操作可以通过直接调用RDD的API实现,常见的RDD操作有filter、map、reduce等。 1. filter:用于筛选符合条件的元素,过滤掉其余的元素。例如,过滤并输出RDD中包含“spark”的元素: rdd.filter(lambda x: "spark" in x).collect() 2. map:用于将每个元素按照一定的规则进行映射,例如将RDD中的每个元素都变成大写: rdd.map(lambda x: x.upper()).collect() 3. reduce:用于按照规定的操作对RDD进行迭代归约,例如对RDD中的元素进行相加求和: rdd.reduce(lambda x, y: x+y) RDD-DataFrame Spark SQL支持RDD与DataFrame的相互转换。RDD是Spark的最基本数据结构之一,DataFrame是一种用于处理结构化数据的API,基于RDD开发而成。 使用RDD创建DataFrame,需要先将RDD映射为Row类型,再通过StructType定义的schema将Row映射为DataFrame。例如: from pyspark.sql import Row from pyspark.sql.types import StructType, StructField, StringType rdd = sc.parallelize([(1, "John"), (2, "Andy"), (3, "Smith")]) row_rdd = rdd.map(lambda x: Row(id=x[0], name=x[1])) schema = StructType([StructField("id", StringType(), True), StructField("name", StringType(), True)]) df = spark.createDataFrame(row_rdd, schema) 使用DataFrame创建RDD,可以使用rdd属性直接将DataFrame转换为RDD。例如: rdd = df.rdd API MySQL Spark SQL可以通过连接MySQL数据库获取数据并进行处理,有两种方法:JDBC和Spark SQL官方提供DataFrame API。使用JDBC需要先进行MySQL的配置,然后通过JDBC连接到MySQL数据库并读取数据,例如: from pyspark.sql import SparkSession spark = SparkSession.builder.appName("MySQLRead").getOrCreate() url = "jdbc:mysql://localhost:3306/mydatabase" properties = {"user": "root", "password": "xxx"} query = "(select * from mytable) as mytable" df = spark.read.jdbc(url=url, table=query, properties=properties) 而使用Spark SQL官方提供DataFrame API,可以使用read.format连同jdbc并指定数据库地址、用户名、密码等参数,例如: from pyspark.sql import SparkSession spark = SparkSession.builder.appName("MySQLRead").getOrCreate() df = spark.read.format("jdbc"). \ option("url", "jdbc:mysql://localhost:3306/mydatabase"). \ option("user", "root"). \ option("password", "xxx"). \ option("dbtable", "(select * from mytable) as mytable"). \ load() 两种方法均可以完成对MySQL数据库的读取和数据处理。 总结 Spark SQL的RDD操作、RDD-DataFrame转换以及MySQL API均为Spark SQL基本操作。可以利用这些基本操作实现Spark SQL中的数据处理、计算和分析等功能。同时,Spark SQL提供了丰富的API和函数库,可以根据具体需求在其基础上进行拓展和应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值