structField、structType、schame-程序员宅基地

技术标签: structfilds  Scala  structType  Spark  

1、structField

源码结构:

case class StructField(

name: String,

dataType: DataType,

nullable: Boolean = true,

metadata: Metadata = Metadata.empty) {}

-----A field inside a StructType
name:The name of this field.
dataType:The data type of this field.
nullable:Indicates if values of this field can be null values.
metadata:The metadata of this field. The metadata should be preserved during transformation if the content of the column is not modified, e.g, in selection.

一个结构体内部的 一个StructField就像一个SQL中的一个字段一样,它包含了這个字段的具体信息,可以看如下列子:

def schema_StructField()={

/**

* StructField 是 一个 case class ,其中是否可以为空,默认是 true,初始元信息是为空

* 它是作为描述 StructType中的一个字段

*/

val sf = new StructField("b",IntegerType)

println(sf.name)//b

println(sf.dataType)//IntegerType

println(sf.nullable)//true

println(sf.metadata)//{}

}

2、structType

A StructType object can be constructed by

StructType(fields: Seq[StructField])

一个StructType对象,可以有多个StructField,同时也可以用名字(name)来提取,就想当于Map可以用key来提取value,但是他StructType提取的是整条字段的信息

在源码中structType是一个case class,如下:

case class StructType(fields: Array[StructField]) extends DataType with Seq[StructField] {}

它是继承Seq的,也就是说Seq的操作,它都拥有,但是从形式上来说,每个元素是用  StructField包住的。

package Dataset


import org.apache.spark.sql.types._



/**

* Created by root on 9/21/16.

*/

object schemaAnalysis {

//--------------------------------------------------StructType analysis---------------------------------------

val struct = StructType(

StructField("a", IntegerType) ::

StructField("b", LongType, false) ::

StructField("c", BooleanType, false) :: Nil)


def schema_StructType()={

/**

* 一个scheme是

*/

import org.apache.spark.sql.types.StructType

val schemaTyped = new StructType()

.add("a","int").add("b","string")

schemaTyped.foreach(println)

/**

* StructField(a,IntegerType,true)

* StructField(b,StringType,true)

*/

}

def structType_extracted()={


// Extract a single StructField.

val singleField_a = struct("a")

println(singleField_a)

//省却的清空下表示:可以为空的,

//StructField(a,IntegerType,true)

val singleField_b = struct("b")

println(singleField_b)

//StructField(b,LongType,false)


//val nonExisting = struct("d")

//println(nonExisting)

//java.lang.IllegalArgumentException: Field "d" does not exist.


// Extract multiple StructFields. Field names are provided in a set.

// A StructType object will be returned.

val twoFields = struct(Set("b", "c"))

println(twoFields)



//StructType(StructField(b,LongType,false), StructField(c,BooleanType,false))

// Any names without matching fields will be ignored.

// For the case shown below, "d" will be ignored and

// it is treated as struct(Set("b", "c")).

val ignoreNonExisting = struct(Set("b", "c", "d"))

println(ignoreNonExisting)

// ignoreNonExisting: StructType =

// StructType(List(StructField(b,LongType,false), StructField(c,BooleanType,false)))


//值得注意的是:当没有存在的字段的时候,官方文档说:单个返回的是null,多个返回的是当没有那个字段

//但是实验的时候,报错---Field d does not exist

//源码调用的是apply方法,确实还没有处理好这部分功能

//我是用的是spark2.0初始版本


}

def structType_opration()={


/**

* 源码:case class StructType(fields: Array[StructField]) extends DataType with Seq[StructField] {

* 它是继承与Seq的,也就是说 Seq的操作,StructType都有

* 可以查看scala的Seq的操作:http://www.scala-lang.org/api/current/#scala.collection.Seq

*/

val tmpStruct = StructType(StructField("d", IntegerType)::Nil)

//集合与集合的操作

println(struct++tmpStruct)

// println(struct++:tmpStruct)

//List(StructField(a,IntegerType,true), StructField(b,LongType,false), StructField(c,BooleanType,false), StructField(d,IntegerType,true))


//集合与元素的操作

println(struct :+ StructField("d", IntegerType))


//可以用add来进行


println(struct.add("e",IntegerType))

//StructType(StructField(a,IntegerType,true), StructField(b,LongType,false), StructField(c,BooleanType,false), StructField(e,IntegerType,true))


//head 部分的元素

println(struct.head)

//StructField(a,IntegerType,true)



//last 部分的元素

println(struct.last)

//StructField(c,BooleanType,false)


println(struct.apply("a"))

//StructField(a,IntegerType,true)


println(struct.treeString)


/**

* root

|-- a: integer (nullable = true)

|-- b: long (nullable = false)

|-- c: boolean (nullable = false)

*/


println(struct.contains(StructField("f", IntegerType)))

//false


println(struct.mkString)

//StructField(a,IntegerType,true)StructField(b,LongType,false)StructField(c,BooleanType,false)


println(struct.prettyJson)


/**

* {

"type" : "struct",

"fields" : [ {

"name" : "a",

"type" : "integer",

"nullable" : true,

"metadata" : { }

}, {

"name" : "b",

"type" : "long",

"nullable" : false,

"metadata" : { }

}, {

"name" : "c",

"type" : "boolean",

"nullable" : false,

"metadata" : { }

} ]

}

*/

//更多操作可以查看API:http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.types.StructType

}




def main(args: Array[String]) {

//schema_StructType()

//structType_extracted()

structType_opration()

}

}

3、Schema

---------Schema就是我们数据的数据结构描述。

       一个Schema是一个数据结构的描述(比如描述一个Json文件),它可以是在运行的时候隐式导入,或者在编译的时候就导入。 它是用一个StructField集合对象的StructType描述(用一个三元tuple,内部是:name,type.nullability),本来有四个信息的为什么会说是三元数组? 其实metadata,你是可以调出来。

def schema_op()={

case class Person(name: String, age: Long)

val sparkSession = SparkSession.builder().appName("data set example")

.master("local").getOrCreate()

import sparkSession.implicits._

val rdd = sparkSession.sparkContext.textFile("hdfs://master:9000/src/main/resources/people.txt")

val dataSet = rdd.map(_.split(",")).map(p =>Person(p(0),p(1).trim.toLong)).toDS()

println(dataSet.schema)

//StructType(StructField(name,StringType,true), StructField(age,LongType,false))



/**

* def schema: StructType = queryExecution.analyzed.schema

*

* def apply(name: String): StructField = {

* nameToField.getOrElse(name,

* throw new IllegalArgumentException(s"""Field "$name" does not exist."""))

* }

*/

val tmp: StructField = dataSet.schema("name")

println(tmp)

//StructField(name,StringType,true)



println(tmp.name)//name

println(tmp.dataType)//StringType

println(tmp.nullable)//true

println(tmp.metadata)//{}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36535820/article/details/108990980

智能推荐

hdu 1229 还是A+B(水)-程序员宅基地

文章浏览阅读122次。还是A+BTime Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24568Accepted Submission(s): 11729Problem Description读入两个小于10000的正整数A和B,计算A+B。...

http客户端Feign——日志配置_feign 日志设置-程序员宅基地

文章浏览阅读419次。HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息。FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。BASIC:仅记录请求的方法,URL以及响应状态码和执行时间。NONE:不记录任何日志信息,这是默认值。配置Feign日志有两种方式;方式二:java代码实现。注解中声明则代表某服务。方式一:配置文件方式。_feign 日志设置

[转载]将容器管理的持久性 Bean 用于面向服务的体系结构-程序员宅基地

文章浏览阅读155次。将容器管理的持久性 Bean 用于面向服务的体系结构本文将介绍如何使用 IBM WebSphere Process Server 对容器管理的持久性 (CMP) Bean的连接和持久性逻辑加以控制,使其可以存储在非关系数据库..._javax.ejb.objectnotfoundexception: no such entity!

基础java练习题(递归)_java 递归例题-程序员宅基地

文章浏览阅读1.5k次。基础java练习题一、递归实现跳台阶从第一级跳到第n级,有多少种跳法一次可跳一级,也可跳两级。还能跳三级import java.math.BigDecimal;import java.util.Scanner;public class Main{ public static void main(String[]args){ Scanner reader=new Scanner(System.in); while(reader.hasNext()){ _java 递归例题

面向对象程序设计(荣誉)实验一 String_对存储在string数组内的所有以字符‘a’开始并以字符‘e’结尾的单词做加密处理。-程序员宅基地

文章浏览阅读1.5k次,点赞6次,收藏6次。目录1.串应用- 计算一个串的最长的真前后缀题目描述输入输出样例输入样例输出题解2.字符串替换(string)题目描述输入输出样例输入样例输出题解3.可重叠子串 (Ver. I)题目描述输入输出样例输入样例输出题解4.字符串操作(string)题目描述输入输出样例输入样例输出题解1.串应用- 计算一个串的最长的真前后缀题目描述给定一个串,如ABCDAB,则ABCDAB的真前缀有:{ A, AB,ABC, ABCD, ABCDA }ABCDAB的真后缀有:{ B, AB,DAB, CDAB, BCDAB_对存储在string数组内的所有以字符‘a’开始并以字符‘e’结尾的单词做加密处理。

算法设计与问题求解/西安交通大学本科课程MOOC/C_算法设计与问题求解西安交通大学-程序员宅基地

文章浏览阅读68次。西安交通大学/算法设计与问题求解/树与二叉树/MOOC_算法设计与问题求解西安交通大学

随便推点

[Vue warn]: Computed property “totalPrice“ was assigned to but it has no setter._computed property "totalprice" was assigned to but-程序员宅基地

文章浏览阅读1.6k次。问题:在Vue项目中出现如下错误提示:[Vue warn]: Computed property "totalPrice" was assigned to but it has no setter. (found in <Anonymous>)代码:<input v-model="totalPrice"/>原因:v-model命令,因Vue 的双向数据绑定原理 , 会自动操作 totalPrice, 对其进行set 操作而 totalPrice 作为计..._computed property "totalprice" was assigned to but it has no setter.

basic1003-我要通过!13行搞定:也许是全网最奇葩解法_basic 1003 case 1-程序员宅基地

文章浏览阅读60次。十分暴力而简洁的解决方式:读取P和T的位置并自动生成唯一正确答案,将题给测点与之对比,不一样就给我爬!_basic 1003 case 1

服务器浏览war文件,详解将Web项目War包部署到Tomcat服务器基本步骤-程序员宅基地

文章浏览阅读422次。原标题:详解将Web项目War包部署到Tomcat服务器基本步骤详解将Web项目War包部署到Tomcat服务器基本步骤1 War包War包一般是在进行Web开发时,通常是一个网站Project下的所有源码的集合,里面包含前台HTML/CSS/JS的代码,也包含Java的代码。当开发人员在自己的开发机器上调试所有代码并通过后,为了交给测试人员测试和未来进行产品发布,都需要将开发人员的源码打包成Wa..._/opt/bosssoft/war/medical-web.war/web-inf/web.xml of module medical-web.war.

python组成三位无重复数字_python组合无重复三位数的实例-程序员宅基地

文章浏览阅读3k次,点赞3次,收藏13次。# -*- coding: utf-8 -*-# 简述:这里有四个数字,分别是:1、2、3、4#提问:能组成多少个互不相同且无重复数字的三位数?各是多少?def f(n):list=[]count=0for i in range(1,n+1):for j in range(1, n+1):for k in range(1, n+1):if i!=j and j!=k and i!=k:list.a..._python求从0到9任意组合成三位数数字不能重复并输出

ElementUl中的el-table怎样吧0和1改变为男和女_elementui table 性别-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏2次。<el-table-column prop="studentSex" label="性别" :formatter="sex"></el-table-column>然后就在vue的methods中写方法就OK了methods: { sex(row,index){ if(row.studentSex == 1){ return '男'; }else{ return '女'; }..._elementui table 性别

java文件操作之移动文件到指定的目录_java中怎么将pro.txt移动到design_mode_code根目录下-程序员宅基地

文章浏览阅读1.1k次。java文件操作之移动文件到指定的目录_java中怎么将pro.txt移动到design_mode_code根目录下

推荐文章

热门文章

相关标签