本期内容:

Java开发DataFrame实战

Scala开发DataFrame实战

 

Spark1.3开始大多数SparkSQL都基于DataFrame编程。因为DataFrame高效且功能强大。

SparkSQl作为一个分布式查询引擎。SparkSQL一般都和Hive一起使用。

Java开发Spark应用程序的原因:

Java为核心

更傻瓜,更易理解

 

中有HiveContext子类。

 

官网建议任何时候都用HiveContext。一般情况下都可以直接用HiveContext而不需要使用SQLContext

,可以通过指定hive-site.xml配置,这给我们一个启发:如果有一些特别的配置,可以这样指定。但如果指定其他文件,会覆盖默认参数hive-site.xml(注意:Spark的Conf目录下也有hive-site.xml文件)

spark-submit --class com.dt.spark.sql.DataFrameOps --master spark://slq1:7077 /home/richard/spark-1.6.0/SparkApps/wordCount.jar

 

Hive的不同数据来源。如果不配置的话Spark会自动找Spark中的Hive配置信息。

Hive

 

代码如下:

package
  
import
import
import
import
  
public class
public static void main(String[] args){
//创建SparkConf用于读取系统配置信息并设置当前应用程序名称
 conf = new SparkConf().setAppName("DataFrameOps");
//创建JavaSparkContext对象实例作为整个Driver核心基石
 sc = new JavaSparkContext(conf);
//创建SQLContext上下文对象用于SQL分析
 sqlContext = new SQLContext(sc);
//创建DataFrame,可以简单认为DataFrame是一张表
//DataFrame可以来源于多种格式
//如JSON,可以直接创建DataFrame
//SQLContext只支持SQL一种方言,用HiveContext就可以支持多种
//方言(默认HQL,可以设置)。
 df = sqlContext.read().json("HDFS://slq1:9000/user/people.json");
//select * from table
df.show();
//describe table;
df.printSchema();
df.select("name").show();
// select name age+1 from table;
df.select(df.col("name"),df.col("age").plus(10)).show();
//select * from table where age > 20;
df.filter(df.col("age").gt(20)).show();
//select count(1) from table group by age;
df.groupBy(df.col("age")).count().show();
 }
 }

 

scala代码:

package com.dt.spark.SparkApps.sql
  
 import org.apache.spark.SparkContext
 import org.apache.spark.SparkConf
 import org.apache.spark.sql.SQLContext
  
 使用Java的方式开发实战对DataFrame的操作
 object DataFrameOps {
   def main(args: Array[String]): Unit = {
     val conf = new SparkConf()
     conf.setAppName("DataFrameOps")
     conf.setMaster("spark://slq1:7077")
     val sc = new SparkContext
     val sqlContext = new SQLContext(sc)
     val df = sqlContext.read.json("hdfs://slq1:9000/user/data/SparkResources/people.json")
     df.show()
     df.printSchema()
     df.select("name").show()
     df.select(df("name"),df("age") + 10).show()
     df.filter(df("age") > 10).show()
     df.groupBy("age").count.show()    
   }
 }

jar包:

eclipse菜单File->export,选择destination为JAR file后点击Next:


SparkAppsScala项目,选择导出路径后点击Finish。


SparkAppsScala.jar文件放入虚拟机中。

shell执行:

/home/richard/spark-1.6.0/bin/spark-submit --class com.dt.spark.SparkApps.sql.DataFrameOps --master spark://slq1:7077 /home/richard/slq/spark/SparkAppsScala.jar
shell一般是这样的:
 /home/richard/spark-1.6.0/bin/spark-submit --class com.dt.spark.SparkApps.sql.DataFrameOps --files //home/richard/spark-1.6.0/conf/hive-site.xml --driver-class-path /home/richard/hive-1.2.1/lib/MySQL-connector-java-5.1.32-bin.jar --master spark://slq1:7077 /home/richard/slq/spark/SparkAppsScala.jar
  
 执行结果如下:

 

[richard@slq1 spark]$ ./SparkAppsScala.sh
 16/03/27 07:40:57 INFO scheduler.DAGScheduler: Job 2 finished: show at DaraFrameOps.scala:16, took 1.228109 s
 +----+-------+
 | age|   name|
 +----+-------+
 |null|Michael|
 |  30|   Andy|
 |  19| Justin|
 +----+-------+
 其他省略