<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[三丰的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/zpf336</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; zpf336]]></copyright><item><title><![CDATA[Hive 添加分区(partition)后count 为0]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/125162066</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/125162066</guid><author>zpf336</author><pubDate>Tue, 07 Jun 2022 12:27:50 +0800</pubDate><description><![CDATA[Hive 添加分区(partition)后count 为0]]></description><category></category></item><item><title><![CDATA[理解Pandas的Transform]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/123988332</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/123988332</guid><author>zpf336</author><pubDate>Wed, 06 Apr 2022 15:33:05 +0800</pubDate><description><![CDATA[Pandas具有丰富的功能让我们探索，transform就是其中之一，利用它可以高效地汇总数据。
Python Data Science Handbook 是一个关于pandas的优秀资源。
在该书的描述中，transform是与groupby（pandas中最有用的操作之一）组合使用的。一般情况下，我们在groupby之后使用aggregate, filter 或 apply来汇总数据，transform可能稍难理解。
该书对应的github资源 jupyter notebooks里的内容可能对理解tr.]]></description><category></category></item><item><title><![CDATA[BroadcastNestedLoopJoin和禁不掉的广播]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/120844632</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/120844632</guid><author>zpf336</author><pubDate>Tue, 19 Oct 2021 14:50:21 +0800</pubDate><description><![CDATA[先来看一个普通的Left Join
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.broadcast

case class People(id: Int, name: String)

case class Student(sid: Int, sname: String)

object TestBroadcastNestedLoopJoin3 {

    def main(args: Arr]]></description><category></category></item><item><title><![CDATA[使用explain来分析broadcast]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/120840999</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/120840999</guid><author>zpf336</author><pubDate>Tue, 19 Oct 2021 11:08:36 +0800</pubDate><description><![CDATA[最近发现一个问题，可以看到有DataFrame被广播，但不知道是左边还是右边，试图通过执行计划来判断哪个数据源被广播。
准备数据
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.broadcast

case class People(id: Int, name: String)

case class Student(sid: Int, sname: String)

object Broadca]]></description><category></category></item><item><title><![CDATA[通过可视化图了解您的 Spark 应用程序]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/120734225</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/120734225</guid><author>zpf336</author><pubDate>Tue, 12 Oct 2021 23:03:59 +0800</pubDate><description><![CDATA[过去，Apache Spark UI 在帮助用户调试应用程序方面发挥了重要作用。在最新的 Spark 1.4 版本中，我们很高兴地宣布数据可视化浪潮已经进入 Spark UI。此版本中新增的可视化功能包括三个主要组件：

Spark 事件的时间线视图
执行 DAG
Spark Streaming 统计数据的可视化

这篇博文将是由两部分组成的系列文章中的第一篇。这篇文章将涵盖前两个组成部分，并将最后一个部分保存到下一周的后续文章中。
Spark 事件的时间线视图
自 Spark 的早期版本以来，Spark ]]></description><category></category></item><item><title><![CDATA[使用explain来分析Spark应用]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/120364028</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/120364028</guid><author>zpf336</author><pubDate>Sat, 18 Sep 2021 11:45:07 +0800</pubDate><description><![CDATA[理解Spark的执行计划对Spark调优是非常重要的。Spark提供了一个explain API去查看Spark SQL查询的执行计划。在这篇文章中我会展示给你如何使用explain去获取执行计划以至于你可以调试和分析你的Spark应用。explain在Dateset上是可用的。你可以用它在Spark 查询真正运行之前就知道Spark的执行计划。当然，Spark也提供了UI，你可以通过UI去看Spark的执行计划以及其它细节当Spark 应用正在运行的时候。并且你可以配置Spark History Serv]]></description><category></category></item><item><title><![CDATA[Spark的spark-*和blockmgr-*目录里是什东西，怎么来的]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/120034302</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/120034302</guid><author>zpf336</author><pubDate>Wed, 01 Sep 2021 10:40:41 +0800</pubDate><description><![CDATA[blockmgr-*
blockmgr-* 是谁创建的
grep blockmgr-83325444-bc05-491e-8db4-752c5b282d0a stderr

21/09/01 11:17:15 INFO storage.DiskBlockManager: Created local directory at /var/tmp/mesos/slaves/2a06b6b8-3000-40f9-9008-51caaef53399-S1/frameworks/2a06b6b8-3000-40f9-9]]></description><category></category></item><item><title><![CDATA[Spark Event Log (三) ListenerBus]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/120023738</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/120023738</guid><author>zpf336</author><pubDate>Tue, 31 Aug 2021 18:27:25 +0800</pubDate><description><![CDATA[Event 流程图
#mermaid-svg-3ItgqGclvxJ8Gevm .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-3ItgqGclvxJ8Gevm .label text{fill:#333}#mermaid-svg-3ItgqGclvxJ8Gevm .node rect,#mermaid-svg-]]></description><category></category></item><item><title><![CDATA[Spark Event Log (二) 开始和结束]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/119917175</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/119917175</guid><author>zpf336</author><pubDate>Wed, 25 Aug 2021 18:46:35 +0800</pubDate><description><![CDATA[Spark Event Log Start
上一节已经看过操作Spaek Event Log的类是org.apache.spark.scheduler.EventLoggingListener,现在来分析一下start()方法
  /**
   * Creates the log file in the configured log directory.
   */
  def start() {
    if (!fileSystem.getFileStatus(new Path(logBaseDir))]]></description><category></category></item><item><title><![CDATA[Spark Event Log (一)概述]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/119874101</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/119874101</guid><author>zpf336</author><pubDate>Mon, 23 Aug 2021 18:39:02 +0800</pubDate><description><![CDATA[这里写自定义目录标题什么是Spark Event Log为什么需要Spark Event Log如何开启Spark Event LogSpark Event Log张什么样子简单分析Spark Event LogSpark Event Log在History Server显示是什么样的是谁在写Event Log参考
什么是Spark Event Log
Spark Event Log是Spark内部主要的事件日志。比如Spark Application什么时候启动，什么时候关闭，什么时候Task开始，什么时]]></description><category></category></item><item><title><![CDATA[Markdown模版]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/119874001</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/119874001</guid><author>zpf336</author><pubDate>Mon, 23 Aug 2021 17:29:16 +0800</pubDate><description><![CDATA[这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题，有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能，丰富你的文章UML 图表FLowchart流程图导出与导入导出导入
欢迎使用Markdown编辑器
你好！ 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar]]></description><category></category></item><item><title><![CDATA[Jupyter Notebook 添加kernel]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/119786435</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/119786435</guid><author>zpf336</author><pubDate>Wed, 18 Aug 2021 18:53:14 +0800</pubDate><description><![CDATA[我本地的环境是conda 4.9.2， 基于python3的版本。

默认有一个base的环境，安装了juoyter notebook就默认有一个python3的kernel

查看kernel：


(base) darren.zhang$ jupyter kernelspec list

Available kernels:
    python3              /Users/darren.zhang/Library/Jupyter/kernels/python3

添加一个python2.]]></description><category></category></item><item><title><![CDATA[ls 命令显示的total是什么意思]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/118752873</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/118752873</guid><author>zpf336</author><pubDate>Thu, 15 Jul 2021 10:06:09 +0800</pubDate><description><![CDATA[今天我无意间在用ls命令的时候发现显示的内容里的total,这个total代表着什么，引起了我的疑惑。

接下来开始解开它的神秘面纱。



total后面的数字是指当前目录下所有文件所占用的空间总和，它是怎么计算的，我们先来看看每个文件的大小。（文件的单位是bytes）



我们将所有的文件大小加起来也只有3536bytes ，是远远没有24kbytes的啊。

但是我们需要知道的是每个文件系统都规定的一个块（block）的大小，我们可以通过命令getconf PAGESIZE 命令来查看数据块规定的大]]></description><category></category></item><item><title><![CDATA[Python 程序打包成egg或whl安装包]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/118380679</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/118380679</guid><author>zpf336</author><pubDate>Thu, 01 Jul 2021 10:41:29 +0800</pubDate><description><![CDATA[环境准备：


conda create -n test
conda activate test
conda install python=3.7.0

安装完毕，确认版本信息：



准备测试目录和文件


mkdir test_setup
cd test_setup
touch setup.py

问题：为什么要准备setup.py?

setup.py其实是python工具包distutils的配置文件，setuptools就是基于distutils来做的。在setup.py中通过setup函数来配置]]></description><category></category></item><item><title><![CDATA[Python 代码检查之Pylint]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/115356140</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/115356140</guid><author>zpf336</author><pubDate>Wed, 31 Mar 2021 18:15:21 +0800</pubDate><description><![CDATA[Pylint是什么

pylint是一个python代码检查工具

Pylint能干什么



这里列出了很多，单是我想前三种应该是最有用的

检查python代码符不符合PEP8规范
	检查代码中的错误
	提供重构建议
下面就用一个例子来展开说明

如何安装


pip install pylint

如何使用


pylint python file

# or

pylint python package


例子：




import logging

logging.basicConfig(le]]></description><category></category></item><item><title><![CDATA[Python 反射]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/114992193</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/114992193</guid><author>zpf336</author><pubDate>Thu, 18 Mar 2021 22:56:10 +0800</pubDate><description><![CDATA[这篇文章是参考别人写的，自己找了些例子联系了一下。

首先说动态导入模块：



正常引用Server类应该怎么写呢？


from module.blog.server import Server

如果我知道可Server类的全路径，通过字符串去动态导入Server类该怎么实现呢？

这个在上一节Python 反射实现class.forName功能已经说过了。

反射机制：

其实，反射就是通过字符串的形式，导入模块；通过字符串的形式，去模块寻找指定函数，并执行。利用字符串的形式去对象（模块）中操作（查]]></description><category></category></item><item><title><![CDATA[Python 反射实现class.forName功能]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/114953355</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/114953355</guid><author>zpf336</author><pubDate>Wed, 17 Mar 2021 22:35:13 +0800</pubDate><description><![CDATA[我有一个类，需要通过配置文件来创建对象，测试类如下：



那么全路径就是：


lib.utils.test.Test

代码如下：


class Test(object):
    def __init__(self, name=1, age=1, **kwargs):
        self.name = name
        self.age = age

    def get_name(self):
        return self.name

    def get_age(se]]></description><category></category></item><item><title><![CDATA[Spark 常用的辅助配置]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/113370836</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/113370836</guid><author>zpf336</author><pubDate>Fri, 29 Jan 2021 10:32:45 +0800</pubDate><description><![CDATA[classpath

稍后更新
]]></description><category></category></item><item><title><![CDATA[Git Debug]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/112186402</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/112186402</guid><author>zpf336</author><pubDate>Mon, 04 Jan 2021 16:50:03 +0800</pubDate><description><![CDATA[export GIT_TRACE=1
export GIT_CURL_VERBOSE=1

执行上述两条命令可以在使用git的时候显示debug信息。

参考：https://stackoverflow.com/questions/6178401/how-can-i-debug-git-git-shell-related-problems
]]></description><category></category></item><item><title><![CDATA[Spark Error pyspark.sql.utils.ParseException: “\nmismatched input ‘FROM‘ expecting]]></title><link>https://blog.youkuaiyun.com/zpf336/article/details/110423371</link><guid>https://blog.youkuaiyun.com/zpf336/article/details/110423371</guid><author>zpf336</author><pubDate>Tue, 01 Dec 2020 10:31:31 +0800</pubDate><description><![CDATA[代码片段：


data = spark.sql(f"""
    SELECT
        p.skuseq
      , p.name
      , p.enabled
    FROM
        base_promotion p
    WHERE
        p.enabled is TRUE
""")

错误信息：


py4j.protocol.Py4JJavaError: An error occurred while calling o24.sql.
: org.apach]]></description><category></category></item></channel></rss>