《大数据技术基础》上机三

  1. 编程实现文件合并和去重操作
对于两个输入文件,即文件A和文件B,请编写MapReduce程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文件C。下面是输入文件和输出文件的一个样例供参考。 python代码
#!/bin/python

import sys
import os

argv = sys.argv
file1=sys.argv[2].split("/")[-1]
file2=sys.argv[3].split("/")[-1]

os.system("wget http://{}:50075/streamFile{}?nnaddr=127.0.0.1:9000 -O {} >> /dev/null".format(argv[1],argv[2],file1))

os.system("wget http://{}:50075/streamFile{}?nnaddr=127.0.0.1:9000 -O {} >> /dev/null".format(argv[1],argv[3],file2))

A = open(file1,'r').read().split('\n')
B = open(file2,'r').read().split('\n')
C = []

print(A)
print(B)

def m(x):
    if len(x) != 0 and not(x in C):
        print("Appending : " + x)
        C.append(x)

list(map(m, A))
list(map(m, B))

print("result after map:")
for x in C:
    print(x)
运行命令
python mapred1.py 192.168.43.206 /A.txt /B.txt
  1. 编写程序实现对输入文件的排序
现在有多个输入文件,每个文件中的每行内容均为一个整数。要求读取所有文件中的整数,进行升序排序后,输出到一个新的文件中,输出的数据格式为每行两个整数,第一个数字为第二个整数的排序位次,第二个整数为原待排列的整数。下面是输入文件和输出文件的一个样例供参考。
python代码
#!/bin/python


import sys
import os

argv = sys.argv
file1=sys.argv[2].split("/")[-1]
file2=sys.argv[3].split("/")[-1]
file3=sys.argv[4].split("/")[-1]
os.system("wget http://{}:50075/streamFile{}?nnaddr=127.0.0.1:9000 -O {} > /dev/null".format(argv[1],argv[2],file1))
os.system("wget http://{}:50075/streamFile{}?nnaddr=127.0.0.1:9000 -O {} > /dev/null".format(argv[1],argv[3],file2))
os.system("wget http://{}:50075/streamFile{}?nnaddr=127.0.0.1:9000 -O {} > /dev/null".format(argv[1],argv[4],file3))

def sp(x):
    return open(x,'r').read().split('\n')[0:-1]

A,B,C = list(map(sp, [file1,file2,file3]))

print(A)
print(B)
print(C)

def mer(x):
    return int(x)

D = list(map(mer,A+B+C))

D.sort()
print("result after map:")
for x in range(len(D)):
    print(str(x+1) + ' ' + str(D[x]))
执行命令
python mapred2.py 192.168.43.206 /3-2-1.txt /3-2-2.txt /3-2-3.txt
  1. 对给定的表格进行信息挖掘
下面给出一个child-parent的表格,要求挖掘其中的父子辈关系,给出祖孙辈关系的表格。
python代码
#!/bin/python

import sys
import os

argv = sys.argv
file1=sys.argv[2].split("/")[-1]

os.system("wget http://{}:50075/streamFile{}?nnaddr=127.0.0.1:9000 -O {} >> /dev/null".format(argv[1],argv[2],file1))


A = open(file1,'r').read().split('\n')[1:-1]
par={}
def m(x):
    if len(x) != 0 :
        kid, parent = x.split('\t')
        par[kid]=[]
        return [kid,parent]

B=list(map(m, A))

kids=list(par.keys())

def mkdic(x):
    par[x[0]].append(x[1])

list(map(mkdic,B))

def getparent(x):
    if x in par:
        return par[x]
    else:
        return ['']

def findgrand(x):
    return list(map(getparent,par[x]))

grands = list(map(findgrand,kids))

print('grandchild\tgrandparent')
for i in range(len(grands)):
    grand1, grand2 = grands[i]
    for g in grand1+grand2:
        if len(g) != 0:
            print(kids[i] + '\t\t' + g)
#命令
python mapred3.py 192.168.43.206  /parents.txt

《大数据技术基础》上机二

  1. 编程实现以下指定功能,并用Hadoop提供的HBase Shell命令完成相同任务:
(1)列出HBase所有的表的相关信息,例如表名;
hbase(main):001:0> list
(2)在终端打印出指定的表的所有记录数据;
scan 'test'
(3)向已经创建好的表添加和删除指定的列族或列;
put 'test','1','column1 data:*','test of c1'
(4)清空指定的表的所有记录数据;
truncate 'test'
(5)统计表的行数。
count 'test'
  1. 现有以下关系型数据库中的表和数据,要求将其转换为适合于HBase存储的表并插入数据:
学生表(Student)
学号(S_No) 姓名(S_Name) 性别(S_Sex) 年龄(S_Age)
2015001 Zhangsan male 23
2015003 Mary female 22
2015003 Lisi male 24
课程表(Course)
课程号(C_No) 课程名(C_Name) 学分(C_Credit)
123001 Math 2.0
123002 Computer Science 5.0
123003 English 3.0
选课表(SC)
学号(SC_Sno) 课程号(SC_Cno) 成绩(SC_Score)
2015001 123001 86
2015001 123003 69
2015002 123002 77
2015002 123003 99
2015003 123001 98
2015003 123002 95
创建表
create 'Student','S_No','S_Name','S_Sex','S_Age'
create 'Course','C_No','C_Name','C_Credit' 
create 'SC','SC_Sno','SC_Cno','SC_Score' 
添加数据 以Student表为例
put 'Student','s001','S_No','2015001' 
put 'Student','s001','S_Name','Zhangsan' 
put 'Student','s001','S_Sex','male' 
put 'Student','s001','S_Age','23' 
查看特定行的特定列
get 'Student','s001',{COLUMN=>'S_Sex'}
更改数据 直接put覆盖即可
put 'Student','s001',"S_Sex","male"
删特定行的数据
deleteall "Student","s002"
  1. 利用HBase和MapReduce完成如下任务: 假设HBase有2张表,表的逻辑视图及部分数据如下所示:
书名(bookName) 价格(price)
atabase System Concept 30$
Thinking in Java 60$
Data Mining 25$
要求:从HBase读出上述两张表的数据,对“price”的排序,并将结果存储到HBase中。
 create 'book','bookName' 
 put 'book','val_60$','bookName:','Thinking in Java' 
 put 'book','val_20$','bookName:','Database System Concept' 
 put 'book','val_30$','bookName:','Data Mining' 

《大数据技术基础》上机一

1.编程实现以下指定功能,并利用Hadoop提供的Shell命令完成相同任务: (1)向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件;
#!/bin/bash

if [ -n $1 ]
then
    if [ -e $1 ]
    then
        if [ -n $2 ]
        then
            `hdfs dfs -test -e $2$1`
            if [ $? -eq 0 ]
            then
                `hdfs dfs -appendToFile $1 $2$1`
            else
                `hdfs dfs -put $1 $2$1`
            fi

        else
            echo "请指定上传到hadoop中的位置"
        fi
    else
        echo "$1 不存在"
    fi
else
    echo "请制定上传的文件"
fi

(2)从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;
#!/bin/bash

if [ -n $1 ]
then
    `hdfs dfs -test -e $1`
    if [ $? -eq 0 ]
    then
        if [ -n $2 ]
        then
            n="(1)"
            file="downFromHdfs"
            while [ -e $file ]
            do
                file=$file"_"$n
            done
            `hdfs dfs -copyToLocal $1 $file`
        else
            n="(2)"
            file="downFromHdfs"
            while [ -e $file ]
            do
                file=$file"_"$n
            done
            `hdfs dfs -copyToLocal $1 $file`
        fi
    else
        echo "没有这个文件:$1"
    fi
else
    echo "请指定下载的文件"
fi
(3)将HDFS中指定文件的内容输出到终端中;
hdfs dfs -cat /test1.txt
(4)显示HDFS中指定的文件的读写权限、大小、创建时间、路径等信息;
hdfs dfs -ls /test1.txt
(5)给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息;
hdfs dfs -ls /
(6)提供一个HDFS内的文件的路径,对该文件进行创建和删除操作。如果文件所在目录不存在,则自动创建目录;
hdfs dfs -rm /test/text.txt #删除文件
hdfs dfs -mkdir /dir #创文件夹
hdfs dfs -touchz /dir/dir1/t.txt #创建文件
(7)提供一个HDFS的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录文件所在目录不存在则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删除该目录;
hdfs dfs -mkdir -p /dir/dir1 #递归创建文件夹
hdfs dfs -rmdir /dir #删除文件夹
hdfs dfs -rmr /dir #递归删文件夹
(8)向HDFS中指定的文件追加内容,由用户指定内容追加到原有文件的开头或结尾;
hdfs dfs -appendToFile append.txt /test1.txt #向结尾追加
#向开头追加
hdfs dfs -get /test1.txt
cat test1.txt >> append.txt
hdfs dfs -put -f append.txt /test1.txt
(9)删除HDFS中指定的文件;
hdfs dfs -rm /test1.txt
(10)删除HDFS中指定的目录,由用户指定目录中如果存在文件时是否删除目录;
hdfs dfs -mkdir -p /dir
(11)在HDFS中,将文件从源路径移动到目的路径。
hdfs dfs -mv /test1.txt /test2.txt