以编程方式执行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 条评论
登录 后参与评论

相关文章

来自专栏包子铺里聊IT

DAG、Workflow 系统设计、Airflow 与开源的那些事儿

DAG (Directed Acyclic Graph) 是一个非常有用、也有很有意思的数据结构。如果说数组、链表、二叉树这类数据结构是学习中的基础,那么 DA...

4154
来自专栏calmound

cocos2d-x 3.0的入门程序:helloworld

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

3467
来自专栏算法+

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

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

7127
来自专栏CSDN技术头条

黑客与C语言

“黑客”这个词想必我们已经如雷贯耳了。我们一听到黑客通常在大脑中的印象就是一群穿着黑衣,躲在小屋里偷偷用着数台电脑针对某组计算机,神不知鬼不觉地进行攻击。他们通...

5978
来自专栏玄魂工作室

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

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

1072
来自专栏牛客网

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

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

4315
来自专栏LhWorld哥陪你聊算法

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

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

4875
来自专栏大数据文摘

UK DN AS NN WG UX AA:这是一条加密推送!

1304
来自专栏鸿的学习笔记

批处理

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

1062
来自专栏吉浦迅科技

[教程] 系列报道——PyOpenCL介绍

OpenCL一直被软件工程师诟病说很难学习,但我觉得这是不公平的。OpenCL API的通用性,导致了它比较繁琐。一旦你写了一些OpenCL代码,你就会意识到很...

6157

扫码关注云+社区