最近写代码的感想和总结

背景:最近帮别人写了2个pyspark的代码以及帮别人安装环境,在做的过程中碰到很多的困难。所以想把这些困难做个总结。

问题总结:

1,由于客户需要交付的是ipynb文件,所以需要在jupyter上写pyspark程序。所以问题是jupyter怎么加载pyspark包?

2,客户提供的是一个json文档数据集,json中有很多的array数据集,当这些array数据通过spark读入dataframe时,要怎么对这些数据进行延展平铺?

3,怎么把dataframe的数据转成list

4,怎么做python 多维分析的可视化操作

5,有很多的环境时不能连互联网的,那么碰到命令不能够使用要怎么处理

问题解决:

问题一解决

在命令行中执行以下命令就可以。

PYSPARK_DRIVER_PYTHON=jupyter PYSPARK_DRIVER_PYTHON_OPTS='notebook' /Users/xxxxx/Downloads/spark/bin/pyspark

问题二解决

当我们想到数据列转行时,我门一开始想到的是 hive 的 lateral view explode,想到pyspark.sql.function 包中的explode。但是当有多个字段需要平铺,并且不能够让数据翻倍时,意思是每个array中的数据是一一对应的的。那要怎么处理。代码如下:

#对海拔字段altitude进行列转行,并添加一个序号列pos,形成dataframe df1
df1=df.filter(col("userId").isNotNull()).select("id","userId","gender","sport","url",posexplode("altitude").alias("pos","altitude"))
#对心率字段heart_rate进行列转行,并添加一个序号列pos,形成dataframe df2
df2=df.filter(col("userId").isNotNull()).select("id",posexplode("heart_rate").alias("pos","heart_rate"))
#对维度字段latitude进行列转行,并添加一个序号列pos,形成dataframe df3
df3=df.filter(col("userId").isNotNull()).select("id",posexplode("latitude").alias("pos","latitude"))
#对经度字段longitude进行列转行,并添加一个序号列pos,形成dataframe df4
df4=df.filter(col("userId").isNotNull()).select("id",posexplode("longitude").alias("pos","longitude"))
#对时间字段timestamp进行列转行,并添加一个序号列pos,
#把源中的unix timestamp转换为标准格式的timestamp类型并命名为 timestamp
#通过上面转换的timestamp字段进行抽取年月日,命名day
#通过上面转换的timestamp字段进行抽取小时,命名hour
#形成dataframe df5
df5=df.filter(col("userId").isNotNull()).select("id",posexplode("timestamp").alias("pos","timestamp"))\
    .withColumn("timestamp",concat_ws(".",from_unixtime(substring(col("timestamp"),0,10),"yyyy-MM-dd HH:mm:ss"),substring(col("timestamp"),-3,3)))\
    .withColumn("day",substring(col("timestamp"),0,10))\
    .withColumn("hour",substring(col("timestamp"),12,2))
#对速度字段speed进行列转行,并添加一个序号列pos,形成dataframe df6
df6=df.filter(col("userId").isNotNull()).select("id",posexplode("speed").alias("pos","speed"))
#把上面所有的dataframe数据集进行join形成 源文件的dataframe数据集,join的条件是id 和 pos
df_all=df1.join(df2,on=["id","pos"],how='inner').drop(df2.pos)\
          .join(df3,on=['id','pos'],how='inner').drop(df3.pos)\
          .join(df4,on=['id','pos'],how='inner').drop(df4.pos)\
          .join(df5,on=['id','pos'],how='inner').drop(df5.pos)\
          .join(df6,on=['id','pos'],how='inner').drop(df6.pos)

之前也尝试过对每一个array数据进行explode,后来发现在pyspark中不能够在一个dataframe中同时使用2次及以上explode,因为这样会让数据翻倍,内存吃紧。这里花了很长时间

问题三解决

通过把df 转成rdd,之后collect()

df = df.rdd.flatMap(lambda x: x).collect()

问题四解决

问题四现在还没完全解决,我只做了一维的散点图,没有做多维的散点图

altitude_list=df_correlation.filter(col("time")=="morning").filter(substring(col("day"),0,4)=="2015").select("altitude").rdd.flatMap(lambda x:x).collect()
x=np.array(altitude_list)

heart_list=df_correlation.filter(col("time")=="morning").filter(substring(col("day"),0,4)=="2015").select("heart_rate").rdd.flatMap(lambda x:x).collect()
y=np.array(heart_list)

s=(20*np.random.rand(len(heart_list))**2)
plt.figure(figsize=(10,10))
plt.xlabel('altitude')
plt.ylabel('heart_rate')
plt.scatter(x,y,s)
plt.show()

问题五 没有解决

场景是,有很多机构的虚拟机环境出于对安全考虑不会连接互联网,那么就会出现某些命令不能够使用的情况,当时一直在纠结互联网的问题,后来才清楚可以去另外的一台连了互联网的linux虚拟机环境下载一个rpm安装包,之后上传到此虚拟机,直接通过yum安装就行

yum install -y yum-plugin-downloadonly

yum --hlp #查看yum是否有 --downloadonly

mkdir /opt/bunzip

yum install bunzip2 --downloadonly --downloaddir=/opt/bunzip

进入/opt/bunzip 帮忙把bunzip2_xx.rpm的安装包发一下

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark和Hadoop实验总结报告 一、实验背景 本次实验是为了了解分布式系统中的大数据处理工具,主要学习Apache Spark和Hadoop两个分布式大数据处理工具的使用和比较。 二、实验目的 1. 了解Apache Spark和Hadoop大数据处理框架的基本原理和架构; 2. 学习使用Spark和Hadoop处理大规模数据; 3. 掌握Spark和Hadoop的优缺点比较。 三、实验内容 1. 安装配置Hadoop和Spark; 2. 学习Hadoop和Spark的基本概念和使用方法; 3. 使用Hadoop和Spark进行数据处理; 4. 分析比较Hadoop和Spark的优缺点。 四、实验步骤 1. 安装配置Hadoop和Spark 我采用的是在Ubuntu 18.04系统下使用wget工具下载并解压Hadoop、Spark等软件包进行安装配置。安装配置的过程中主要遇到了如下几个问题: (1) Hadoop配置文件修改:Hadoop的配置文件许多,操作起来较为繁琐,需要仔细阅读并修改配置文件信息。 (2) Spark的环境变量配置:Spark需要在bashrc文件做全局环境变量的配置。我遇到过Spark安装完成后,hadoop-daemon.sh start namenode启动失败的问题,其中还涉及到了Java的配置问题。最后通过重启Ubuntu系统和再次配置后解决。 2. 学习Hadoop和Spark基本概念和使用方法 Hadoop和Spark都是分布式大数据处理的工具。Hadoop分为两个子项目:HDFS和MapReduce,其中HDFS是分布式文件系统,MapReduce是分布式计算框架;而Spark则是一种快速、通用的集群计算系统,可以支持内存计算,对于迭代计算模型有较好的支持。 3. 使用Hadoop和Spark进行数据处理 我采用了两个较基础的数据处理算法: (1) WordCount算法:统计给定文本中每个单词出现的次数。这是大数据处理领域中最常用的算法之一,也是Hadoop的HelloWorld。 (2) 温度计算算法:使用气象站收集的数据计算出每个月的平均气温。 通过这两个算法,我掌握了Hadoop和Spark的数据处理流程、API接口和调试方法。数据处理过程中我的主要工作是对Hadoop和Spark处理结果的正确性和可读性进行验证和评估。 4. 分析比较Hadoop和Spark的优缺点 (1) 简便性方面:Hadoop的安装配置过程较为繁琐,安装配置过程中遇到的问题也比较多,需要仔细阅读文档才能进行操作。相比之下,Spark的安装配置过程较为简单,同时也成为了大数据处理工具中的一种主流工具之一。 (2) 易用性方面:Hadoop的编代码和编译打包需要耗费一定的时间,查错也比较困难,而Spark的交互式编程可以更直观便捷地进行数据操作。 (3) 性能方面:Spark的RDD(弹性分布式数据集)是一个高速缓存,可以将数据缓存到内存中,从而快速响应数据操作请求。而Hadoop的分布式计算则需要中间文件,处理较为频繁。因此在对大规模数据进行处理的时候,Spark具有更快的计算速度。 五、实验感想 本次实验,我对大数据处理这一领域有了更深入的了解。Hadoop和Spark都是本领域中非常重要的工具,在学习的过程中,我不仅提升了大数据处理能力,也加深了对分布式计算的理解,对未来的学习和工作都有一定的借鉴意义。 总之,本次实验内容丰富,操作繁琐,不过从中我也收获颇丰,掌握了Spark和Hadoop数据处理的基本操作和API接口,了解了Hadoop和Spark的优缺点。通过实验,我进一步加深了对专业知识的理解,同时也获得了实践经验,对以后的学习和研究具有重要意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值