Spark中RDD转换成DataFrame的两种方式(分别用Java和scala实现)
来源:互联网 发布:mastercam攻丝怎么编程 编辑:程序博客网 时间:2024/05/23 16:40
一:准备数据源
在项目下新建一个student.txt文件,里面的内容为:
1,zhangsan,202,lisi,213,wanger,194,fangliu,18二:实现
Java版:
1.首先新建一个student的Bean对象,实现序列化和toString()方法,具体代码如下:
package com.cxd.sql;import java.io.Serializable;@SuppressWarnings("serial")public class Student implements Serializable { String sid; String sname; int sage; public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public int getSage() { return sage; } public void setSage(int sage) { this.sage = sage; } @Override public String toString() { return "Student [sid=" + sid + ", sname=" + sname + ", sage=" + sage + "]"; } }2.转换,具体代码如下
package com.cxd.sql;import java.util.ArrayList;import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.sql.Dataset;import org.apache.spark.sql.Row;import org.apache.spark.sql.RowFactory;import org.apache.spark.sql.SaveMode;import org.apache.spark.sql.SparkSession;import org.apache.spark.sql.types.DataTypes;import org.apache.spark.sql.types.StructField;import org.apache.spark.sql.types.StructType;public class TxtToParquetDemo { public static void main(String[] args) { SparkConf conf = new SparkConf().setAppName("TxtToParquet").setMaster("local"); SparkSession spark = SparkSession.builder().config(conf).getOrCreate(); reflectTransform(spark);//Java反射 dynamicTransform(spark);//动态转换 } /** * 通过Java反射转换 * @param spark */ private static void reflectTransform(SparkSession spark) { JavaRDD<String> source = spark.read().textFile("stuInfo.txt").javaRDD(); JavaRDD<Student> rowRDD = source.map(line -> { String parts[] = line.split(","); Student stu = new Student(); stu.setSid(parts[0]); stu.setSname(parts[1]); stu.setSage(Integer.valueOf(parts[2])); return stu; }); Dataset<Row> df = spark.createDataFrame(rowRDD, Student.class); df.select("sid", "sname", "sage"). coalesce(1).write().mode(SaveMode.Append).parquet("parquet.res"); } /** * 动态转换 * @param spark */ private static void dynamicTransform(SparkSession spark) { JavaRDD<String> source = spark.read().textFile("stuInfo.txt").javaRDD(); JavaRDD<Row> rowRDD = source.map( line -> { String[] parts = line.split(","); String sid = parts[0]; String sname = parts[1]; int sage = Integer.parseInt(parts[2]); return RowFactory.create( sid, sname, sage ); }); ArrayList<StructField> fields = new ArrayList<StructField>(); StructField field = null; field = DataTypes.createStructField("sid", DataTypes.StringType, true); fields.add(field); field = DataTypes.createStructField("sname", DataTypes.StringType, true); fields.add(field); field = DataTypes.createStructField("sage", DataTypes.IntegerType, true); fields.add(field); StructType schema = DataTypes.createStructType(fields); Dataset<Row> df = spark.createDataFrame(rowRDD, schema); df.coalesce(1).write().mode(SaveMode.Append).parquet("parquet.res1"); } }
scala版本:
import org.apache.spark.sql.SparkSessionimport org.apache.spark.sql.types.StringTypeimport org.apache.spark.sql.types.StructFieldimport org.apache.spark.sql.types.StructTypeimport org.apache.spark.sql.Rowimport org.apache.spark.sql.types.IntegerTypeobject RDD2Dataset { case class Student(id:Int,name:String,age:Int) def main(args:Array[String]) { val spark=SparkSession.builder().master("local").appName("RDD2Dataset").getOrCreate() import spark.implicits._ reflectCreate(spark) dynamicCreate(spark) } /** * 通过Java反射转换 * @param spark */ private def reflectCreate(spark:SparkSession):Unit={ import spark.implicits._ val stuRDD=spark.sparkContext.textFile("student2.txt") //toDF()为隐式转换 val stuDf=stuRDD.map(_.split(",")).map(parts⇒Student(parts(0).trim.toInt,parts(1),parts(2).trim.toInt)).toDF() //stuDf.select("id","name","age").write.text("result") //对写入文件指定列名 stuDf.printSchema() stuDf.createOrReplaceTempView("student") val nameDf=spark.sql("select name from student where age<20") //nameDf.write.text("result") //将查询结果写入一个文件 nameDf.show() } /** * 动态转换 * @param spark */ private def dynamicCreate(spark:SparkSession):Unit={ val stuRDD=spark.sparkContext.textFile("student.txt") import spark.implicits._ val schemaString="id,name,age" val fields=schemaString.split(",").map(fieldName => StructField(fieldName, StringType, nullable = true)) val schema=StructType(fields) val rowRDD=stuRDD.map(_.split(",")).map(parts⇒Row(parts(0),parts(1),parts(2))) val stuDf=spark.createDataFrame(rowRDD, schema) stuDf.printSchema() val tmpView=stuDf.createOrReplaceTempView("student") val nameDf=spark.sql("select name from student where age<20") //nameDf.write.text("result") //将查询结果写入一个文件 nameDf.show() }}注:1.上面代码全都已经测试通过,测试的环境为spark2.1.0,jdk1.8。
2.此代码不适用于spark2.0以前的版本。
阅读全文
0 0
- Spark中RDD转换成DataFrame的两种方式(分别用Java和scala实现)
- Spark中RDD转换成DataFrame的两种方式(分别用Java和scala实现)
- Spark将RDD转换成DataFrame的两种方式
- Spark将RDD转换成DataFrame的两种方式
- RDD和DataFrame转换(Java+Scala)
- 利用JAVA、SCALA实现RDD和DataFrame转换
- RDD转换为DataFrame的两种方式及spark sql的简单实例
- spark基础之RDD和DataFrame的转换方式
- Spark RDD/DataFrame map保存数据的两种方式
- spark rdd转dataframe的两种方式
- RDD转换成DataFrame的两种方法
- [2.2]Spark DataFrame操作(二)之通过反射实现RDD与DataFrame的转换
- 使用Java和Scala在IDE中实战RDD和DataFrame转换操作
- 使用Java和Scala在IDE中实战RDD和DataFrame动态转换操作
- Java接入Spark之创建RDD的两种方式和操作RDD
- Java接入Spark之创建RDD的两种方式和操作RDD
- 使用java 将 Spark RDD和DataFrame转换
- SPARK 使用Java 在IDE中实战RDD和DataFrame动态转换操作
- 使用ViewFlipper实现屏幕切换动画效果
- Linux系统编程——特殊进程之僵尸进程
- Java IO 操作基础1---普通文件的相关操作
- git submodule以及被忽略的.gitignore
- Django模型设计详解系列之三
- Spark中RDD转换成DataFrame的两种方式(分别用Java和scala实现)
- 慎用重定向 301
- 送给毕业的歌
- LoggerFactory.getLogger用法
- pandas 常用函数
- sed用法
- centos安装redis
- 程序员日常工作英文20170625
- C语言之数字雨