DataSet是分布式的数据集,是spark1.6才被添加进来的。比DataFrame出现的晚。DataSet支持lambda表达式,而且DataFrame的API在DataSet中大部分都可以继续使用,相当于DataFrame的升级版。
Spark如何解析csv文件
待处理文件infos.txt
,内容如下:
id,name,age
1,vincent,20
2,sarah,19
3,sofia,29
4,monica,26
代码如下:
package cn.ac.iie.spark
import org.apache.spark.sql.SparkSession
/**
* DataSet 操作
*/
object DataSetApp {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().appName("DataFrameCase").master("local[2]").getOrCreate()
// spark如何解析csv文件
val df = spark.read.option("header", "true").option("inferSchema", "true").csv("file:///E:/test/infos.txt")
df.show()
// 注意需要导入隐式转换
import spark.implicits._
val ds = df.as[Infos]
ds.map(line => line.id).show()
spark.close()
}
case class Infos(id: Int, name: String, age: Int)
}
静态类型(Static-typing)和运行时类型安全(runtime type-safety)
Syntax Errors语法解析错误:编写SQL时,是在运行时才解析SQL语句写的对不对。
Analysis Errors对于分析错误:SQL也是在运行时才能知道是不是正确。
举个栗子:
SQL语句是:select name from person;
,当我们写的时候单词写错了写成了:selcet name from peson;
,那么这个SQL语句在编译的时候是成功的,但是在执行过程中是错误的。
DataFrame:df.select("name")
如果这句话写错成了df.selcet("name")
那么编译是不通过的。而写错成了df.select("nname")
那么编译时不通过。
DataSet:ds.map(line => line.name)
如果写成ds.map(line => line.nname)
那么编译是就不通过了。