Spark 结构化API——基础操作
基本概念
DataFrame:
分布式,表格形式,行和列的集合;每一列的行数必须相同;列有特定的类型,列类型对所有行都一致。
Schema:
定义DataFrame所有列的名字和类型。
以下是如何查询一个结构化数据的schema(spark类型推断):
// in Scala
spark.read.format("json").load("/data/flight-data/json/2015-summary.json").schema
返回schema信息:
org.apache.spark.sql.types.StructType = ...
StructType(StructField(DEST_COUNTRY_NAME,StringType,true),
StructField(ORIGIN_COUNTRY_NAME,StringType,true),
StructField(count,LongType,true))
schema是由StructField组成的StructType,以下是如何定义一个Schema:
// in Scala
import org.apache.spark.sql.types.{StructField, StructType, StringType, LongType}
import org.apache.spark.sql.types.Metadata
val myManualSchema = StructType(Array(
StructField("DEST_COUNTRY_NAME", StringType, true),
StructField("ORIGIN_COUNTRY_NAME", StringType, true),
StructField("count", LongType, false,
Metadata.fromJson("{\"hello\":\"world\"}"))
))
如何使用定义的schema加载数据(不适用scala的类型推断):
val df = spark.read.format("json").schema(myManualSchema)
.load("/data/flight-data/json/2015-summary.json")
Spark数据类型:
ByteType, ShortType, IntegerType, LongType, FloatType, DoubleType, DecimalType, StringType, BinaryType, BooleanType, TimestampType, DataType, ArrayType
column:
用下面的方法引用列,列是否存在只在运行程序时才解析:
// in Scala
import org.apache.spark.sql.functions.{col, c