Spark(json类型转换为DataFrame进行sql查询分
2020-03-28 本文已影响0人
AlexYao
1.达成目标
读取采用逗号分隔的txt文件数据,通过sql对于txt文件中的数据进行查询
2.实现
2.1 数据示例
{"name":"Michael"}
{"name":"Andy", "age":30}
{"name":"Justin", "age":19}
2.2 思路
读取文件,形成javaRDD对象,对于每行数据进行分隔,形成以Row封装的JavaRDD<Row>对象,定义数据的格式后,结合Row对象,生成新的Dataset<Row>,调用sqlContext的sql方法,对于Dataset<Row>进行查询,得到结果
2.3 实现
代码:
package com.surfilter.spark.java;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
/**
* description: RDD2DataFrameByJson <br>
* date: 2020/3/28 4:10 下午 <br>
* author: yaohao <br>
* version: 1.0 <br>
*/
public class RDD2DataFrameByJson {
public static void main(String args[]) {
//创建一个sparksession
SparkSession spark = SparkSession
.builder()
.appName("RDD2DataFrameProgrammatically")
.master("local")
.getOrCreate();
//读取文件,创建一个javaRDD,读取文件的textFile获取的是RDD方法,需要使用toJavaRDD,转换为javaRDD对象
//这里的数据结构为 {"name":"Justin", "age":19} 每行一条数据
Dataset<Row> rfDataset = spark.read().json("/Users/yaohao/tools/spark-2.4.5-bin-hadoop2.7/examples/src/main/resources/people.json");
//可以理解为注册城一张表,支持后面采用sql方式进行查询
rfDataset.registerTempTable("person");
//执行查询语句
Dataset<Row> result = rfDataset.sqlContext().sql("select age,name from person where age>=18");
result.show();
}
}