以编程方式执行Spark SQL查询的两种实现方式

摘 要

在自定义的程序中编写Spark SQL查询程序

1.通过反射推断Schema

package com.itunic.sql

import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}

/**
  * Created by itunic.com on 2017/1/2.
  * Spark SQL
  * 通过反射推断Schema
  * by me:
  * 我本沉默是关注互联网以及分享IT相关工作经验的博客,
  * 主要涵盖了操作系统运维、计算机编程、项目开发以及系统架构等经验。
  * 博客宗旨:把最实用的经验,分享给最需要的你,
  * 希望每一位来访的朋友都能有所收获!
  *
  */
object InferringSchema {
  def main(args: Array[String]): Unit = {
 //创建SparkConf()并设置App名称
    val conf = new SparkConf().setAppName("InferringSchema").setMaster("local")
 //SQLContext要依赖SparkContext
    val sc = new SparkContext(conf)
 //创建SQLContext
    val sqlContext = new SQLContext(sc)
 //从指定的地址创建RDD
    val lineRdd = sc.textFile("F:\\test\\input\\wc.txt").map(f => {
      val fields = f.split("\t")
 //将RDD和case class关联
      Person(fields(0).toLong, fields(1), fields(2).toInt)
    })
 //导入隐式转换,如果不导入无法将RDD转换成DataFrame
 //将RDD转换成DataFrame
 import sqlContext.implicits._
    val personDF = lineRdd.toDF
 //注册表
    personDF.registerTempTable("t_person")
 //传入SQL
    val df = sqlContext.sql("select * from t_person order by age desc limit 2")
 //显示
    df.show()
 //以json方式写入hdfs
 //df.write.json("hdfs://ns1:9000/wc")
    sc.stop()
  }
}

//定义样例类
case class Person(id: Long, userName: String, age: Int)

2.通过StructType直接指定Schema

package com.itunic.sql

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.sql.types._

/**
  * Created by itunic.com on 2017/1/2.
  *  Spark SQL
  * 通过StructType直接指定Schema
  * by me:
  * 我本沉默是关注互联网以及分享IT相关工作经验的博客,
  * 主要涵盖了操作系统运维、计算机编程、项目开发以及系统架构等经验。
  * 博客宗旨:把最实用的经验,分享给最需要的你,
  * 希望每一位来访的朋友都能有所收获!
  *
  */
object SpecifyingSchema {
  def main(args: Array[String]): Unit = {
 //创建SparkConf()并设置App名称
    val conf = new SparkConf().setAppName("SpecifyingSchema").setMaster("local")
 //SQLContext要依赖SparkContext
    val sc = new SparkContext(conf)
 //创建SQLContext
    val sqlContext = new SQLContext(sc)
 //通过StructType直接指定每个字段的schema
    val schema = StructType(
      List(
        StructField("id", LongType, true),
        StructField("name", StringType, true),
        StructField("age", IntegerType, true)
      )
    )

    val lineRdd = sc.textFile("F:\\test\\input\\wc.txt").map(f => {
      val fields = f.split("\t")
      Row(fields(0).toLong, fields(1), fields(2).toInt)
    })
 //将schema信息应用到lineRdd上
    val personDF = sqlContext.createDataFrame(lineRdd, schema)
    personDF.registerTempTable("t_person")
 //传入SQL
    val df = sqlContext.sql("select * from t_person order by age desc limit 2")
 //显示
    df.show()
 //以json方式写入hdfs
 //df.write.json("hdfs://ns1:9000/wc")
    sc.stop()
  }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏鸿的学习笔记

批处理

今天要聊的批处理,在前些年,有个忽悠人的外号,就是所谓的大数据。最经典的处理模式就是MapReduce,它起源于谷歌的《MapReduce:Simplified...

982
来自专栏Kirito的技术分享

中文文案排版指南

目录 空格 中英文之间需要增加空格 中文与数字之间需要增加空格 数字与单位之间需要增加空格 全角标点与其他字符之间不加空格 -ms-text-autospac...

4168
来自专栏calmound

cocos2d-x 3.0的入门程序:helloworld

看过了这么多不同方向的应用,发现很多程序入门都是helloworld helloworld是所有程序员的绝对初恋 先看一下程序的运行结果吧 ? 然后就是他...

3377
来自专栏数据结构与算法

9.21模拟赛解题报告

上来看T1,咦?我好像做过这题在仙人掌上的版本。。树上更简单吧。。写+拍 1h,期间拍出了暴力的两个bug。。。

744
来自专栏玄魂工作室

CTF实战33 综合实战和讲解三

该培训中提及的技术只适用于合法CTF比赛和有合法授权的渗透测试,请勿用于其他非法用途,如用作其他非法用途与本文作者无关

842
来自专栏https://www.cnblogs.com/L

【自然语言处理篇】--Chatterbot聊天机器人

ChatterBot是一个基于机器学习的聊天机器人引擎,构建在python上,主要特点是可以自可以从已有的对话中进行学(jiyi)习(pipei)。

2675
来自专栏小樱的经验随笔

1022: [SHOI2008]小约翰的游戏John【Nim博弈,新生必做的水题】

1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2709 ...

3158
来自专栏程序员叨叨叨

7.3 const

Cg 语言也提供 const 修辞符,与 C\C++中含义一样,被 const 所修辞的变量在初始化之后不能再去改变它的值。下面的例子程序中有一个声明为 con...

822
来自专栏牛客网

【后台开发】百度,头条,腾讯面经

半年了,从七月的迷之自信,到十月的0offer,迷茫、反思、不甘,各位战友的鼓励激励着我前进... 终于拿到了offer,感谢牛客网长期以来的陪伴,在此献上面经...

4115
来自专栏算法+

音频压缩编码 opus 附完整C++代码示例

绝大数人都知道mp3格式编码,以及aac,amr等压缩格式编码。 而在语音通信界有一个强悍的音频格式编码opus. 经过实测,压缩比最高可以达到1:10。 10...

6127

扫码关注云+社区