Scala创建DataFrame的几种方式

本文详细介绍了三种在Scala中创建Spark DataFrame的方法:1) 通过数据源直接读取JSON文件;2) 利用反射机制从CSV数据创建DataFrame,包括创建样例类、转换RDD并映射为DataFrame;3) 编程方式定义模式,包括创建模式字符串、构建字段、转换RDD为Row类型并创建DataFrame。这些方法展示了DataFrame在Spark数据处理中的灵活性。

1 通过数据源创建DF

原始数据:

{"name":"Tom","age":18},
{"name":"Alice","age":17}

步骤:

//读取目录文件
scala> val df = spark.read.json("file:///opt/module/spark/mycode/a.json")
df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]

//创建临时视图
scala> df.createOrReplaceTempView("people")

//查看DF
scala> spark.sql("select * from people").show

//打印结果
+---+-----+
|age| name|
+---+-----+
| 18|  Tom|
| 17|Alice|
+---+-----+

2 通过反射机制创建DF

原始数据:

Tom,18
Alice,17

步骤:

//导入包,支持把一个RDD隐式转换为一个DataFrame
scala> import spark.implicits._ 

//1.创建样例类
case class People(name:String, age: Int)

//2.创建RDD
scala> val rdd = sc.textFile("file:///opt/module/spark/mycode/b.txt")
rdd: org.apache.spark.rdd.RDD[String] = file:///opt/module/spark/mycode/b.txt MapPartitionsRDD[1] at textFile at <console>:24

//3.使用map算子将每一行都创建一个People对象
scala> val df = rdd.map(_.split(",")).map(data=>People(data(0),data(1).toInt)).toDF
df: org.apache.spark.sql.DataFrame = [name: string, age: int]

//4.打印df
scala> df.show
+-----+---+
| name|age|
+-----+---+
|  Tom| 18|
|Alice| 17|
+-----+---+

注意,import spark.implicits._ 中的spark指的是SparkSession对象(在scala交互式环境中默认存在了一个SparkSession对象)。

启动spark-shell时的信息:
在这里插入图片描述

3 使用编程定义方式创建DF

当无法提前定义case class时,就需要采用编程方式定义RDD模式

//导入相关包
scala> import org.apache.spark.sql.types._
import org.apache.spark.sql.types._ 
scala> import org.apache.spark.sql.Row
import org.apache.spark.sql.Row 

//1.定义一个模式字符串
scala> val schemaString = "name age"
schemaString: String = name age

//2.根据模式字符串创建模式
scala> val fields = schemaString.split(" ").map(fieldName=>StructField(fieldName,StringType,nullable=true))
fields: Array[org.apache.spark.sql.types.StructField] = Array(StructField(name,StringType,true), StructField(age,StringType,true))

scala> val schema = StructType(fields)
schema: org.apache.spark.sql.types.StructType = StructType(StructField(name,StringType,true), StructField(age,StringType,true))

//3.将rdd的每条数据转换成Row类型
scala> val rowRDD = rdd.map(_.split(",")).map(data=>Row(data(0),data(1)))
rowRDD: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[19] at map at <console>:29

//4.根据设计的模式创建DF
scala> val df = spark.createDataFrame(rowRDD, schema)
df: org.apache.spark.sql.DataFrame = [name: string, age: string]

//5.打印
scala> df.show
+-----+---+                                                                     
| name|age|
+-----+---+
|  Tom| 18|
|Alice| 17|
+-----+---+
### 如何在Spark中读取数据并创建DataFrameSpark中,可以通过多种方式读取数据并创建DataFrame。以下是几种常见的方法: #### 1. 通过读取JSON文件创建DataFrame Spark支持直接从JSON文件中读取数据并转换为DataFrame。以下是一个示例代码: ```scala val df = spark.read.json("src/main/resources/user.json") df.show() ``` 此方法适用于处理结构化或半结构化的JSON数据[^2]。 #### 2. 通过读取Parquet文件创建DataFrame Parquet是一种高效的列式存储格式,广泛用于大数据处理。以下是一个示例代码: ```scala val parquetDF = spark.read.parquet("file:///export/servers/spark/examples/src/main/resources/users.parquet") parquetDF.show() ``` 此方法适用于处理大规模的结构化数据[^3]。 #### 3. 通过读取文本文件创建DataFrame 对于普通的文本文件,可以使用`spark.read.text`方法将其读取为DataFrame。以下是一个示例代码: ```scala val dataFrame = spark.read.text("/person.txt") dataFrame.show() ``` 此方法适用于处理非结构化或简单的文本数据[^1]。 #### 4. 通过RDD转换为DataFrame 如果数据已经以RDD的形式存在,可以通过定义Schema并调用`createDataFrame`方法将其转换为DataFrame。以下是一个示例代码: ```scala val fields = Array( StructField("id", IntegerType), StructField("name", StringType), StructField("sex", StringType), StructField("age", IntegerType) ) val schema = StructType(fields) val rdd = spark.sparkContext.parallelize(List( Row(1, "zhangsan", "man", 10), Row(2, "zhang2", "woman", 66), Row(3, "zhang3", "man", 70), Row(4, "zhang4", "man", 22) )) val df = spark.createDataFrame(rdd, schema) df.show() ``` 此方法适用于需要手动定义Schema的场景[^2]。 #### 5. 通过SparkSession直接创建DataFrame 在`spark-shell`环境中,可以通过已经初始化好的`SparkSession`对象直接读取数据并创建DataFrame。例如: ```scala val dataFrame = spark.read.text("/person.txt") ``` 此方法适用于快速测试和开发环境[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步一点丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值