Josonlee's Blog

一点一滴 始于足下


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 给我留言

  • 读书

使用Java API操作HDFS文件系统

发表于 2018-11-22 | 分类于 大数据
字数统计:

Configuration

org.apache.hadoop.conf.Configuration 用来创建HDFS的配置对象(conf),一般可通过它来设置hdfs文件系统的uri

Path

org.apache.hadoop.fs.Path 用来定义文件路径对象(path),类似java中Path

FileSystem

org.apache.hadoop.fs.FileSystem 用来定义hdfs文件系统对象(fs)

  • 初始化fs实例的方法:
    • FileSystem.get(conf)
    • FileSystem.get(uri,conf)
    • path.getFileSystem(conf) 这个实际上创建path时会传入uri,实际上调用第二种方法FileSystem.get(uri,conf)
  • fs具体方法:
    • 创建目录:public boolean mkdirs(Path f) throws IOException
    • 创建文件:public static FSDataOutputStream create(FileSystem fs, Path file, FsPermission permission) throws IOException

IOUtils

Spark先修课---Scala语言学习

发表于 2018-11-21 | 分类于 大数据
字数统计:

变量定义 输入输出

条件、循环控制结构 异常处理

数据结构

容器 collection

collection容器,包含List、Vector、Set、Map

在scala.collection.mutable 中是可变容器,scala.collection.immutable 不可变容器

  • List列表

不同于其他语言,scala中List是不可变的,而且是抽象的,不能通过new来创建;直接通过List(xxx),默认会调用apply工厂方法创建列表。可指定类型,也可以不指定,同上文所说scala会自动推断类型

1
2
3
4
5
6
scala> val l = new List(1,2,3)
<console>:11: error: class List is abstract; cannot be instantiated
val l = new List(1,2,3)

scala> val l = List(1,2,3)
l: List[Int] = List(1, 2, 3)

像List、Set、Map无需导入scala.collection.immutable.XXX,因为scala默认导入了Predef对象,该对象为许多数据类型提供了别名定义,包含了List、不可变Set、不可变Map

  • Vector 不可变向量

List、Vector对应的可变版本是ListBuffer、ArrayBuffer

  • Range 不可变数字等差数列

创建如下,必须指定第三个步长参数。Range(1,5,1)等同于1 until 5,都不包含5;1 to 5包含5。同样是通过索引访问,如r(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
scala> val r =new Range(1,5,2)
r: scala.collection.immutable.Range = Range 1 until 5 by 2

scala> 1 to 5
res24: scala.collection.immutable.Range.Inclusive = Range 1 to 5

scala> 1 until 5 //by 可以指定步长
res25: scala.collection.immutable.Range = Range 1 until 5

scala> r(1)
res28: Int = 3

scala> ('a' to 'e' by 2)(1)
res33: Char = c

  • Set 不重复元素集合

可变和不可变集合。默认不导入scala.collection.mutable.Set时,是不可变的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
scala> var s = Set(1,2,3)   // var定义set指向的对象可变
s: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> s += 4 //s指向了新的Set对象
scala> s
res37: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 4)

scala> val set = Set(1,2,3) // val定义set指向的对象不变
set: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> set + 4 // 这是新生成了个set
res19: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 4)

scala> set // set并未改变
res20: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> set += 4 //报错,immutable.Set不可改变
<console>:15: error: value += is not a member of scala.collection.immutable.Set[Int]
Expression does not convert to assignment because receiver is not assignable.
set += 4

这里有一个是,Set和Map不能通过new来初始化,同上面List。但是可以如new HashSet[T](xxx)来创建,创建的依旧是Set、Map

1
2
3
4
5
6
7
8
9
10
11
import scala.collection.mutable.Set
val set = Set(1,2,3)
println(set)
set += 4
println(set)
set.add(5) // set += 5
println(set)
set ++= Set(4,5)
println("Set元素不重复",set)
set.remove(3) //set -= 3
println(set)

或许你会觉得val set,set不是指向的对象不可变吗?但set的内容为什么改变了?很简单,set是变量名,指针指向一个固定的Set对象,但是这个Set对象本身可以变。就算Set本身变了,但指针还是指向该Set对象的,没有毛病

结果如下:

1
2
3
4
5
Set(1, 2, 3)
Set(1, 2, 3, 4)
Set(1, 5, 2, 3, 4)
(Set元素不重复,Set(1, 5, 2, 3, 4))
Set(1, 5, 2, 4)

  • Map 键值对容器

键唯一,值不唯一。也分为可变和不可变两类,同Set

1
2
3
4
5
6
7
8
9
10
11
12
13
import scala.collection.mutable.Map
val map = Map("H"->"Hadoop","S"->("Spark","scala"))
println(map)
map += ("D"->"DUT") //添加key-value
println(map)
map.put("key","value") //添加key-value
map.remove("D") // map -= "D",移除key-value
println(map)
println("包含某个键,map.contains(\"Key\")",map.contains("key")) //包含某个键
println("获取键A对应的值,map.get(\"key\")="+map.get("key"))
println("所有键,map.keys",map.keys)
println("所有值,map.values",map.values)
println("合并map,map++Map(\"D\"->\"DUT\")",map++Map("D"->"DUT"))

结果为:

1
2
3
4
5
6
7
8
Map(S -> (Spark,scala), H -> Hadoop)
Map(S -> (Spark,scala), D -> DUT, H -> Hadoop)
Map(S -> (Spark,scala), key -> value, H -> Hadoop)
(包含某个键,map.contains("Key"),true)
获取键A对应的值,map.get("key")=Some(value)
(所有键,map.keys,Set(S, key, H))
(所有值,map.values,HashMap((Spark,scala), value, Hadoop))
(合并map,map++Map("D"->"DUT"),Map(S -> (Spark,scala), D -> DUT, key -> value, H -> Hadoop))

scala方法定义及参数使用

方法定义:

1
2
3
4
5
def func_name(参数名:类型,...): 返回值类型 = {
//方法体

// 最后一行是返回值,不写return
}

方法体中只有一行代码时,可不写括号,直接跟在等号后面即可
更多内容见下方代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
object Test_4_Function {
def main(args: Array[String]): Unit = {
// 函数定义
println(add(1,2))
print_name()
print_name //无需参数时,函数调用可以不带括号(注:参数都有默认值时仍要带括号)
print_name()
// 默认参数
print_name1("Spark")
print_name1()

// 命名参数
println(max(1,2))
println(max(y = 2,x = 1)) //这就是命名参数,通过参数名指定哪个是哪个,可以不按照顺序传入,但保证参数名没错

// 可变参数
println(1,2,3,4,5)
}

def add(x:Int,y:Int):Int ={ //等同于 def add(x:Int,y:Int):Int = x+y
x+y
}
def print_name(name: String="Hadoop"): Unit ={ //重载,但是未输入参数时,解释器仍按照无默认参数的函数执行;和定义函数的顺序无关
println("my name is"+name)
}
def print_name(): Unit ={
println("My name is Scala")
}

def print_name1(name: String="Hadoop"): Unit ={ //方法无返回值时,以Unit代替(从main函数可以看出来)
println("my name is"+name)
}

def max(x:Int,y:Int):Int ={
if (x>=y)
x
else
y
}

def add(nums:Int*)={
var i = 0
for(num<-nums){
i += num
}
i
}
}

输出结果如下:

1
2
3
4
5
6
7
8
9
3
My name is Scala
My name is Scala
My name is Scala
my name isSpark
my name isHadoop
2
2
15

匿名函数、高阶函数

1
2
3
4
5
val add=(a:Int,b:Int)=>a+b
//等同于下面的
val add = (_:Int)+(_:Int) //参数在函数字面量内仅出现一次可省略=>,用下划线占位(第一个_代表第一个参数)

val sum=(f:(Int,Int)=>Int,a:Int,b:Int)=>f(a,b)

Error汇集

  • Value += is not member of Int
1
2
3
4
5
6
7
8
9
10
11
var i: Int = 0

for (i <- 0 to 10) {
if (i == 2) {
i += 1
}
println(i)
}
><console>:15: error: value += is not a member of Int
Expression does not convert to assignment because receiver is not assignable.
i += 1

遇到这个问题时,头都大了,想不通这居然有错误。中文搜了一波没结果,然后我在shell窗口下输入val a = 0;var b = 1;a += b;,天,也是报这个错误,严重摧毁我学习的热情,我仔细再看了下,发现a申明成了不可变val变量,然后我猜测上面那个函数定义i的时候有两次定义,是不是内层循环中i也是val变量,之后我google英文搜了一下(google就是强),确实是这个问题。

You’re declaring i twice, one at the outer scope and one in the inner. Your for comprehension looks at the inner i, which is a val, not a var, thus shadowing the external declaration.

问题就是for循环中申明的变量是一个val,换个名字就好了

1205查看Demo代码时记录

  • java工具类Map、HashMap
  • SimpleDateFormat类,貌似是用来方便格式化日期字符串的
  • Date.getHours replaced by Calendar.get
  • StringBuilder、StringUtils

Hadoop及Spark学习路线及资源收纳

发表于 2018-11-18 | 分类于 大数据
字数统计:

前言

本人大数据专业方向,收集学习一些相关文章,汇总如下。有些资源来源网络,出处不明,如有错误请告知,谢谢

Hadoop

18.11.18

  • 有的旧的官方文档盖楼:Hadoop 0.18文档

  • Hadoop新手学习指导
    (出处: about云开发)
  • 零基础学习hadoop到上手工作线路指导(初级篇)
    (出处: about云开发)

  • 推荐一个博客分类博主LanceToBigData:Hadoop

一、学习路线图

  • Hadoop家族学习路线图 开篇必读
  • Hive学习路线图
  • Mahout学习路线图

二、编程实践

  • Hadoop历史版本安装
  • 用Maven构建Hadoop项目
  • Hadoop编程调用HDFS
  • 用Maven构建Mahout项目
  • Mahout推荐算法API详解
  • 用MapReduce实现矩阵乘法
  • 从源代码剖析Mahout推荐引擎
  • Mahout分步式程序开发 基于物品的协同过滤ItemCF
  • Mahout分步式程序开发 聚类Kmeans
  • PageRank算法并行实现

三、案例分析

  • 海量Web日志分析 用Hadoop提取KPI统计指标
  • 用Hadoop构建电影推荐系统
  • 用Mahout构建职位推荐引擎
  • Mahout构建图书推荐系统
  • PeopleRank从社交网络中发现个体价值

    作者:Lincoln
    链接:https://www.zhihu.com/question/19795366/answer/24524910
    来源:知乎

    18.11.20 我来更新了

  • 推荐博文、博主
    • 小小默’s Blog,分类很乱但是内容确实不错
    • Hadoop MapReduce Tutorial,挺赞的
    • 哥不是小萝莉·博客园,偏应用吧,概念什么的不咋地
  • 我还搜到一本书,豆瓣上说不错,《Mapreduce2.0源码分析与编程实战》(那个,你们谁有csdn会员啊,csdn上有这个下载,50积分下不起啊。没找到完整版的,你们有的话分享我一下呗。。。)

    Spark

    18.11.18

  • 书籍
    • 《Spark快速大数据分析》[美] Holden Karau [美] Andy Konwinski [美] Patrick Wendell [加] Matei Zaharia 著
    • 《Spark大数据处理:技术、应用与性能优化》
    • 《Spark快速数据处理·美 Holden Karau著》

      18.11.20 我来更新了

  • 上面推荐的书籍,我一一粗略的翻了一下,最好先看第一本《Spark快速大数据分析》
  • 本人是选用scala作为开发语言,最近也在看这门编程语言。说实话,scala写起来真的是不习惯。。。无语。
    • 最近在看厦大林子雨老师的书和视频——《spark 编程基础·scala版》,书是图书馆借的,挺薄一本讲义类型的书,感觉快速上手scala没问题,他也有配套视频Spark编程基础。有些资料可以上厦大的官网上找到,总之一句话,挺适合小白
    • 慕课网有一门课程《学习Scala 进击大数据Spark生态圈》,收费的,当然你也懂(要善于使用网络资源),我个人是支持知识付费的。这门课我也跟进看了,是讲的scala语言。我感觉单看书就可以了,视频太费时间了。
  • 博客资源
    • 关于Spark有哪些大牛们的博客?
    • 徽沪一郎·博客园
    • 等等
  • Spark Overview,这是官方文档,最新的2.4.0版本全英文版。一句话比那些书啊、博客啊好太多了。如果英文不好的话,这里有Spark Overvoew·中文版
  • 就我个人而言,了解scala基础后,在翻完《Spark快速大数据分析》,然后刷文档是非常不错的

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://josonle.github.io

Hadoop伪分布式集群搭建

发表于 2018-11-14 | 分类于 大数据
字数统计:

前言准备

Win10上通过VMware12 + Centos7准备好了基本环境,配置虚拟机的子网IP地址(我这里是192.168.17.0),如图通过管理员可配置子网IP,掩码,网关(我这里是192.168.17.2)

伪分布式特点

具备Hadoop的所有功能,在单机上模拟一个分布式的环境,需要配置hdfs和yarn框架

  • HDFS:主节点:master,从节点:slave 【伪分布式这里也是master】
  • Yarn:容器,运行MapReduce程序

    • 主节点:ResourceManager
    • 从节点:NodeManager
      阅读全文 »

SQL中NOT EXISTS...[EXCEPT]的妙用

发表于 2018-11-13 | 分类于 数据库、SQL
字数统计:

EXISTS子查询可以理解为存在,但也不能死扣字眼,多用在where子句中用来删选满足条件的记录,只要子查询能找到就是True,EXISTS条件就成立,反之不成立;NOT EXISTS与之相反

有以下四张表:

1
2
3
4
Product (pID, name, category, UnitType, sID, price )
Order (oID, year, month, day, type, cID, shipType, status)
OrderDetail (oID, oDetailNum, pID, unitPrice, quantity)
Customer (cID, name, address, phone, creditLimit)

  • 利用not exists 的子查询思想解决如下查询
    • 查询从未在2012年10月卖出去的产品信息,
    • 具体包括: 商品ID,商品名

not exists就是【没有、从未】,其后跟随的子查询就是要解决的后半段问题【肯定部分】

1
2
3
4
5
6
7
8
Select pID, name
From product
Where not exists
(select *
From order join orderDetail
on order.oID = orderDetail.oID
Where year=2012 and month=10 and
product.pID = orderDetail.pID)

有上面代码可以看出not exists只是解释了需求中的【从未】,而子查询负责【在2012年10月卖出去的产品信息】

如果子查询结果集为空,就是没有售卖的信息,not exists【没有、不存在】满足,条件成立

  • 查找学生,该生通过了其所属的系开设的 所有 课程,列出stu_name,dept_name
    • 要用到的有student表(包含学生id,所属的系名,学生名),Course表(包含开课的系名,课程id等),takes表(包含学生id,课程id,成绩等)
1
2
3
4
5
6
7
8
9
10
11
12
select name, dept_name
from student
where not exists (
select course_id
from course
where student.dept_name=course.dept_name
except
select course_id
from takes
where student.ID = takes.ID
and grade != 'F'
)

我们知道except是求差集,所以可以有如下解释

1
2
3
4
5
where not exists (
该学生所属的系开设的所有课程C1
except
学生所有及格的课程C2
)

C1-C2为空,就是C1是C2的子集,not exists成立,满足条件

  • not exists… except 有两种用法,要根据所求语义判断

比如说公司中若干部门,若干等级的职位

  • 求所有职位都是B等级的部门
    • ‘{部门所有职位} except {所有B等级的职位}’
  • 求包含所有B等级职位的部门
    • ‘{所有B等级的职位} except {部门所有职位}’

其实很简单,判断时画个图,就知道谁该包含谁了

如果还想不通,可以参考这篇分析更细致的文章:查询选修了全部课程的学生姓名

计网知识点扫漏

发表于 2018-11-12 | 分类于 计算机网络
字数统计:
  • 计算机网络中常用的三种有线媒体是同轴电缆、 双绞线 、光纤
  • 用电话线接入Internet上网时除了要缴纳信息费给ISP外还要按接入的时间缴纳电话通信费给电信局,这是因为(这种接入方式使用了电路交换技术)
  • 用拨号IP方式连入Internet所需的硬件设备主要有(计算机、Modem、分配了电话号码的电话线)
  • 在Internet中,用字符串表示的IP地址称为(域名)
  • VLAN的划分不包括以下哪种方法?D_。

A.基于端口 B.基于MAC地址

C.基于协议 D.基于物理位置

阅读全文 »

关系数据库设计(F+闭包、候选码求解、范式判断及BCNF分解)

发表于 2018-11-12 | 分类于 数据库、SQL
字数统计:

F+闭包怎么求

  • 第一步:设最终将成为闭包的属性集是Y,把Y初始化为X;
  • 第二步:检查F中的每一个函数依赖A→B,如果属性集A中所有属性均在Y中,而B中有的属性不在Y中,则将其加入到Y中;
  • 第三步:重复第二步,直到没有属性可以添加到属性集Y中为止。 最后得到的Y就是X+

X是题目会给出的,求谁(即X)的闭包;Y是最后所求得的闭包

设关系R(A,B,C,D,E,G)有函数依赖集 F={AB→C,BC→AD,D→E,CG→B},求AB的闭包

X = {A、B} {A、B}+ = Y ={A、B、C、D、E}

由上可知,F逻辑蕴涵AB->D (因为D被{A、B}+包含)

阅读全文 »

SQL平时上机题汇总

发表于 2018-11-12 | 分类于 数据库、SQL
字数统计:

[TOC]

第一次

建表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
CREATE TABLE DEPT (
DEPTNO INT,
DNAME VARCHAR(14),
LOC VARCHAR(13),
-- 名为 PK_DEPT的主键
CONSTRAINT PK_DEPT PRIMARY KEY (DEPTNO)
);

CREATE TABLE BONUS (
ENAME VARCHAR(10),
JOB VARCHAR(9),
SAL INT,
COMM INT
);

CREATE TABLE SALGRADE (
GRADE INT,
LOSAL INT,
HISAL INT
);

CREATE TABLE EMP (
EMPNO INT,
ENAME VARCHAR(10),
JOB VARCHAR(9),
MGR INT,
HIREDATE DATETIME,
SAL FLOAT,
COMM FLOAT,
DEPTNO INT,
-- 名为 PK_EMP 的主键,名为FK_DEPTNO指向表DEPT的DEPTNO的外键
CONSTRAINT PK_EMP PRIMARY KEY (EMPNO),
CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO)
);

i7E4nx.jpg


i7Efj1.jpg


i7EWcR.jpg


题目

  • 将所有员工的工资上浮10%.然后查询员工姓名、薪水、补助。

(emp.sal为工资,emp.comm为补助)

1
2
UPDATE TABLE emp SET sal=sal*0.1;
SELECT ename, sal, comm FROM emp;

  • 查看EMP表中部门号为10的员工的姓名,职位,参加工作时间,工资。
    SELECT ename, job, hiredate, sal FROM emp WHERE DEPTNO = 10;

  • 查所有已有的职位,要求去除重复项。
    SELECT DISTINCT job FROM emp;

  • 计算每个员工的年薪,并取列名为Salary of Year(emp.sal为员工的月薪),要求输出员工姓名,年薪。

SELECT e.ename, e.sal*12 AS 'Salary of Year' FROM emp as e;

阅读全文 »

大数据之Hadoop学习<一>————认识HDFS

发表于 2018-11-12 | 分类于 大数据
字数统计:

分布式文件系统 HDFS

分布式文件系统(Distributed FileSystem)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。

Hadoop有若干文件系统,HDFS只是其中一个,但HDFS是其重要组成部分。HDFS由java的org.apache.hadoop.fs.FileSystem定义,并实现了java.io.Closeable接口,继承了org.apache.hadoop.conf

我们可以通过命令行下 hadoop dfs -ls hdfs:/// 访问HDFS文件系统

HDFS特点

  • 存储超大文件
  • 流式文件访问
    • 高效访问模式:一次写入、多次访问
    • 只支持文件追加操作,不能修改
    • 追加操作要在hdfs-site.xml中的 dfs.support.append 设置为true才行
  • 普通商用硬件上即可运行(实际上普通PC还是不OK,那速度,这都是氪金玩家玩的,hh)
  • 低时间延迟的数据访问
    • 以高时延为代价,获取高数据吞吐量
    • 响应时间秒级、毫秒级的数据访问,应该采用HBase
  • 多用户在写入文件时有锁机制,只支持单个写入者
  • 不适合存大量小文件

    由于 Namenode 将文件系统的元数据存储在内存中,因此
    HDFS所能存储的文件总数受限于Namenode的内存容量
    根据经验,每个文件、目录和数据块的存储信息大约占150
    字节,存储100万个文件大约需要300M内存

    阅读全文 »

VirtualBox设置与主机共享文件夹和粘贴板问题

发表于 2018-10-22 | 分类于 Linux
字数统计:
  • 分享Virtualbox Ubuntu 共享文件夹、自动挂载的一些问题

  • Virtualbox主机和虚拟机之间文件夹共享及双向拷贝

前提是安装那个增强功能,没有遇到什么问题,一遍就过了

123
Joson lee

Joson lee

Python数据分析、机器学习、Django、java学习

26 日志
9 分类
12 标签
GitHub CSDN E-Mail
© 2019 Joson lee | Site words total count:
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4
访问人数 人 总访问量 次