RDD转为Dataset如何指定schema?

与RDD进行互操作

Spark SQL支持两种不同方法将现有RDD转换为Datasets。第一种方法使用反射来推断包含特定类型对象的RDD的schema。这种基于反射的方法会导致更简洁的代码,并且在编写Spark应用程序时已经知道schema的情况下工作良好。

第二种创建Datasets的方法是通过编程接口,允许您构建schema,然后将其应用于现有的RDD。虽然此方法更详细,但它允许你在直到运行时才知道列及其类型的情况下去构件数据集。

使用反射推断模式

Spark SQL的Scala接口支持自动将包含case classes的RDD转换为DataFrame。Case class定义表的schema。使用反射读取case class的参数名称,并将其变为列的名称。Case class也可以嵌套或包含复杂类型,如Seqs或Arrays。此RDD可以隐式转换为DataFrame,然后将其注册为表格。表可以在随后的SQL语句中使用。

// For implicit conversions from RDDs to DataFrames

import spark.implicits._

 

// Create an RDD of Person objects from a text file, convert it to a Dataframe

val peopleDF = spark.sparkContext

?.textFile("examples/src/main/resources/people.txt")

?.map(_.split(","))

?.map(attributes => Person(attributes(0), attributes(1).trim.toInt))

?.toDF()

// Register the DataFrame as a temporary view

peopleDF.createOrReplaceTempView("people")

 

// SQL statements can be run by using the sql methods provided by Spark

val teenagersDF = spark.sql("SELECT name, age FROM people WHERE age BETWEEN 13 AND 19")

 

// The columns of a row in the result can be accessed by field index

teenagersDF.map(teenager => "Name: " + teenager(0)).show()

// +------------+

// | ? ? ? value|

// +------------+

// |Name: Justin|

// +------------+

 

// or by field name

teenagersDF.map(teenager => "Name: " + teenager.getAs[String]("name")).show()

// +------------+

// | ? ? ? value|

// +------------+

// |Name: Justin|

// +------------+

 

// No pre-defined encoders for Dataset[Map[K,V]], define explicitly

implicit val mapEncoder = org.apache.spark.sql.Encoders.kryo[Map[String, Any]]

// Primitive types and case classes can be also defined as

// implicit val stringIntMapEncoder: Encoder[Map[String, Any]]=ExpressionEncoder()

 

// row.getValuesMap[T] retrieves multiple columns at once into a Map[String, T]

teenagersDF.map(teenager => teenager.getValuesMap[Any](List("name", "age"))).collect()

// Array(Map("name" -> "Justin", "age" -> 19))

以编程方式指定模式

当case class不能提前定义时(例如,记录的结构用字符串编码,赵雯或者文本数据集将被解析并且字段对不同的用户值会不同),DataFrame可以以编程方式通过三个步骤创建 。

 

2,使用StructType创建一组schema,然后让其匹配步骤1中Rows的类型结构。

3,使用SparkSession 提供的方法createDataFrame,将schema应用于Rows 类型的RDD。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

推荐阅读:

1,从零开始 Spark 性能调优

2,用java提交一个Spark应用程序

3,SparkStreaming如何解决小文件问题

4,SparkStreaming源码阅读思路

环境进入spark技术学院,与业界大牛交流互动。

640?wx_fmt=jpeg


文章来源:https://blog.csdn.net/rlnLo2pNEfx9c/article/details/80731301

转载于:https://www.cnblogs.com/wangfengxia/p/9627167.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RDD、DataFrame、DataSet是Spark中常用的数据结构,它们之间可以相互转换。 1. RDD转DataFrame 可以通过SparkSession的createDataFrame方法将RDD转换为DataFrame,需要指定DataFrame的schema。 例如: ``` from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType, IntegerType spark = SparkSession.builder.appName("RDD to DataFrame").getOrCreate() rdd = spark.sparkContext.parallelize([(1, "Alice"), (2, "Bob"), (3, "Charlie")]) schema = StructType([ StructField("id", IntegerType(), True), StructField("name", StringType(), True) ]) df = spark.createDataFrame(rdd, schema) df.show() ``` 2. DataFrame转RDD 可以通过DataFrame的rdd方法将DataFrame转换为RDD。 例如: ``` from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType, IntegerType spark = SparkSession.builder.appName("DataFrame to RDD").getOrCreate() data = [(1, "Alice"), (2, "Bob"), (3, "Charlie")] df = spark.createDataFrame(data, ["id", "name"]) rdd = df.rdd rdd.foreach(print) ``` 3. DataFrame转DataSet 可以通过as方法将DataFrame转换为DataSet。 例如: ``` from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType, IntegerType spark = SparkSession.builder.appName("DataFrame to DataSet").getOrCreate() data = [(1, "Alice"), (2, "Bob"), (3, "Charlie")] df = spark.createDataFrame(data, ["id", "name"]) ds = df.as[(int, str)] ds.show() ``` 4. DataSet转DataFrame 可以通过toDF方法将DataSet转换为DataFrame。 例如: ``` from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType, IntegerType spark = SparkSession.builder.appName("DataSet to DataFrame").getOrCreate() data = [(1, "Alice"), (2, "Bob"), (3, "Charlie")] ds = spark.createDataFrame(data, ["id", "name"]).as[(int, str)] df = ds.toDF() df.show() ``` 总之,Spark中的RDD、DataFrame、DataSet可以相互转换,根据实际需求选择合适的数据结构进行操作。 ### 回答2: Spark是一个分布式计算框架,支持多种数据处理模式,包括批处理、流处理和交互式查询。其中,RDD、DataFrame和DataSet是三种常用的数据结构,在Spark中处理复杂数据具有重要意义。下面,我们将会介绍在Spark中RDD、DataFrame和DataSet之间的互相转换。 1. RDD和DataFrame转换 RDD和DataFrame的转换是Spark中最基本也是最常用的转换之一。这种转换很简单,只需在DataFrame对象上调用 rdd() 方法即可将DataFrame转换为RDD对象。同样地,可以通过将RDD对象传递给SparkSession对象的 createDataFrame()方法来将RDD转换为DataFrame。下面是一些代码样例: #将DataFrame转换为RDD df.rdd() #将RDD转换为DataFrame spark.createDataFrame(rdd) 2. RDDDataSet转换 RDDDataSet的转换可以通过使用rdd()方法来实现,该方法将RDD转换为DataSet。另外,还可以使用SparkSession的createDataset()方法,该方法可以将RDD转换为DataSet。具体例如下: #将RDD转换为Dataset val ds = spark.createDataset(rdd) #将Dataset转换为RDD val rdd = ds.rdd 3. DataFrame和DataSet转换 DataFrame和Dataset之间的转换是Spark中比较复杂和繁琐的一个转换,因为DataFrame和DataSet在实现方面存在相当大的差异。幸运的是Spark提供了一些内置的方法,可以帮助我们在DataFrame和DataSet之间进行转换。可以使用SparkSession的createDataFrame()方法将DataSet转换为DataFrame,可以使用as()方法将DataFrame转换为DataSet。例如,可以使用以下代码将DataFrame与DataSet进行转换: #将DataFrame转换为Dataset val ds = df.as[(String, Int)] #将Dataset转换为DataFrame val df = ds.toDF() 总结: 由于Spark的各种数据类型和函数都可以在ScalaJava和Python中使用,因此数据转换的方法基本相同。在使用这些转换时,需要明确数据类型差异、转换函数及其语法、转换后数据的属性才能更好地利用大数据为业务赋能。以上就是RDD、DataFrame和DataSet之间的互相转换的一些基本介绍,通过这些转换可以灵活、高效地处理不同类型的数据,最终实现大数据分析和处理的目的。 ### 回答3: Spark是一个分布式计算引擎,支持基于内存的数据操作和高度可扩展的并行处理,它提供了强大的API来操作不同类型的数据集,其中包括RDD、DataFrame和DataSetRDD(Resilient Distributed Dataset)是Spark中的一个分布式计算模型,它是一个不可变的分布式对象集合,可以被分区,存储在集群节点上。RDD可以通过Transformation和Action操作来进行计算。 DataFrame是Spark SQL中的一个数据结构,它是一种分布式的表,可以表示为行和列的数据结构,相对于RDD来说,DataFrame添加了模式信息和优化能力。 DataSet是Spark 2.0中的一个新的API,是DataFrame的类型安全的版本。DataSet提供了静态类型检查和lambda表达式的功能,并通过在编译时检查类型优化查询执行。 在Spark中,RDD、DataFrame和DataSet之间可以互相转换: 1. RDD转换为DataFrame或DataSetRDD可以通过使用Spark SQL中的toDF方法转换为DataFrame,此时RDD的元素需要是Row类型。如果需要将RDD转换为DataSet,可以使用case class定义类来表示RDD中的元素,并使用Spark Session的createDataset方法来创建DataSet。 2. DataFrame转换为RDDDataSet。 DataFrame可以通过使用rdd方法转换为RDD,此时DataFrame的每一行都被转换成了一个标准的Scala对象。如果需要将DataFrame转换为DataSet,可以使用as方法将DataFrame转换为DataSet。 3. DataSet转换为RDD或DataFrame。 DataSet可以通过使用rdd方法转换为RDD,此时DataSet的每一行都被转换成了一个标准的Scala对象。如果需要将DataSet转换为DataFrame,可以使用toDF方法将DataSet转换为DataFrame。 总之,在Spark中,RDD、DataFrame和DataSet之间可以实现互相转换,开发者可以根据自己的需求选择最适合自己的数据结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值