0%

自定义函数

在使用sql语句的时候会用到函数来对查出来的数据进行再次的操作,可以使用自定义函数来实现自定义的功能

UDF自定义函数

可以使用spark.udf来进行注册添加自定义函数

1
2
3
4
5
6
// 自定义函数名为prefix
spark.udf.register("prefix",(name:String,prefix:String) =>{
prefix+":"+name
})
// 在使用该函数的时候也要使用注册的函数名来进行使用
spark.sql("select prefix(name,'name') from user").show()
阅读全文 »

DataSet编程

DataSet是分布式数据集合,是DataFrame的一个扩展,是强类型的,可以使用如DataSet[User]。

DataFrame其实是DataSet的一个特例,DataFrame=DataSet[Row],DataFrame每一行的类型都是Row,每一列的值无法直接访问,需要进行解析,比较麻烦,而使用DataSet,可以自己定义数据每行的类型

DataSet是强类型的数据集合,类型一般使用的是样例类

阅读全文 »

DataFrame编程

DataFrame是一种以RDD为基础的分布式数据集,类似于关系型数据库的Table表,与RDD的主要区别在于,DataFrame带有schema元信息,表示数据集的每一列都带有名称和类型,而RDD不知道所存数据元素的具体内部结构,只能进行简单、通用的流水线优化。

SparkSession

在Spark Core中使用的是上下文环境SparkContext,而在SparkSQL中使用的是SparkSession,SparkSession是由SparkContext和HiveContext的组合

spark-shell会自动创建SparkContext和SparkSession对象

1
2
Spark context available as 'sc' (master = local[*], app id = local-1621927578517).
Spark session available as 'spark'
阅读全文 »

sparkSQL简介

sparkSQL是Spark用于结构化数据处理的Spark模块,为了给RDBMS但是又不了解MapReduce的开发人员提供的快速入手的工具,在一开始的时候是基于Hive进行开发的,后来为了摆脱对Hive的依赖,SparkSQL进行了重新开发

  • 数据兼容方面 SparkSQL 不但兼容 Hive,还可以从 RDD、parquet 文件、JSON 文件中获取数据,未来版本甚至支持获取 RDBMS 数据以及 cassandra 等 NOSQL 数据
  • 性能优化方面 除了采取 In-Memory Columnar Storage、byte-code generation 等优化技术外、将会引进 Cost Model 对查询进行动态评估、获取最佳物理计划等等
  • 组件扩展方面 无论是 SQL 的语法解析器、分析器还是优化器都可以重新定义,进行扩展
阅读全文 »

大M法

在使用线性规划的时候,遇到了一个场景。

这里简单的说一下场景,要求广告要至少投放2个城市,现在有3个城市可供选择。但是城市投放量要么不投,要投放至少投放100cpm。

这种情况下如何转换成线性规划呢?

这里就可以使用大M法,来将非线性约束线性化,引入binary变量(即只有0和1),这里ca={0,1},然后引入一个极大值M,构建如下约束

1
2
3
4
5
6
7
8
// 由于有三个城市,这里我们引入3个binary变量,即ca1、ca2、ca3
// 每个城市的投放量 c1、c2、c3
// 0表示投放,1表示不投放
1. ca1+ca2+ca3 <= 1
// 当ca1等于0时,也就是c1进行投放,此时c1>=100
// 当ca1等于1时,也就是c1不进行投放,此时M+c1<=M,如果要满足,必须是c1等于0
// 依次写 c2和c3的表达式
2. 100 =< ca1 * M + c1 <= M

根据自己的情况,来选取M的值

阅读全文 »