spark SQL join中的一道题

该博客主要介绍了如何在 Spark SQL 中使用 DataFrame 进行 join 操作。通过案例展示了从不同数据源读取数据,转换为 DataFrame,然后使用内连接(inner join)进行数据融合的过程。涉及的方法包括创建临时视图并使用 SQL 查询,以及使用 DataFrame 的 DSL 方式执行 join。
摘要由CSDN通过智能技术生成

spark SQL join中的一道题

package cn.kfc.dem08

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.{DoubleType, IntegerType, LongType, StringType, StructField, StructType}
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}

case class fun(id:Int,name:String,country:String)
case class nation(nati:String,nat:String)
object joinTest {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession.builder()
      .appName("Sql_join")
      .master("local[*]")
      .getOrCreate()

    import spark.implicits._
    val sc = spark.sparkContext
    //val value= sc.textFile("file/join.txt") //--->方式1.从文档中读取
   // val value = spark.read.textFile("file/join.txt") //-->方式2   spark.read.textFile
     val value = sc.parallelize(Array("1,laozhao,china", "2,laoli,usa"))    //-->3.直接使用数组数据
      //4.使用spark.createDataset方法
    // val value: Dataset[(Int, String, String)] = spark.createDataset(Array("1,laozhao,china", "2,laoli,usa"))   //-->配合元组,样例类使用
      .map(line => {
        val splits = line.split(",")
        val id = splits(0).toInt
        val name = splits(1)
        val country = splits(2)
         //fun(id, name, country)    //---> 创建样例类,与createDateFrame结合使用
        (id, name, country) //-->创建元组,与配合toDF使用
        Row(id,name,country)    //--->配合StructType   createDataFrame(value,sch)使用
      })


    //val df1= spark.createDataFrame(value)     //--->1读取数据使用,方式2直接创建的就是DataFrame


    // val df1 = value.toDF("id","name","country")    //--> 元组使用
    
    val sch: StructType = StructType(List(
      StructField("id", IntegerType, true),
      StructField("name", StringType, true),
      StructField("country", StringType, true)
    ))

    val df1 = spark.createDataFrame(value,sch)




    val country: RDD[nation] = sc.textFile("file/nation.txt")
      .map(line => {
        val splits = line.split(",")
        val nati = splits(0)
        val nat = splits(1)
        nation(nati, nat)
      })

    val df2: DataFrame = spark.createDataFrame(country)

//第一种:创建视图,使用sql
  /*  df1.createTempView("personinfo")
    df2.createTempView("nationinfo")

    spark.sql("selbleType, true)ect id,name,p.country,n.nat from personinfo p inner join nationinfo n on p.country=n.nati ")
        .show()
   */

//第二种方式:DSL
  val df3 = df1.join(df2,$"country" ===$"nati","inner")

        // val df3 = df1.join(df2,"country")    //-->样例类函数将列名称(国家)定义相同时,可以使用此方法

    df3.show()

    sc.stop()
    spark.close()

  }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值