<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>RockyThink</title><description>Data engineer | Indie hacker | Record life</description><link>https://blog.rockythink.work/</link><item><title>Flink 在大数据开发中的应用</title><link>https://blog.rockythink.work/blog/flink-在大数据开发中的应用</link><guid isPermaLink="true">https://blog.rockythink.work/blog/flink-在大数据开发中的应用</guid><description>在现代大数据开发中，实时数据处理变得愈发重要。无论是金融服务中的实时风控，还是电商平台的个性化推荐，企业都需要对实时数据进行处理，以便做出快速决策。Apache Flink 作为一个分布式流处理框架，以其高性能、低延迟和强大的状态管理功能，逐渐成为实时数据处理的首选解决方案。本文将详细介绍 Flink 在大数据开发中的应用，并探讨其在实际业务场景中的使用优势。</description><pubDate>Sun, 21 Jul 2024 00:00:00 GMT</pubDate><content:encoded>#### 引言

在现代大数据开发中，实时数据处理变得愈发重要。无论是金融服务中的实时风控，还是电商平台的个性化推荐，企业都需要对实时数据进行处理，以便做出快速决策。Apache Flink 作为一个分布式流处理框架，以其高性能、低延迟和强大的状态管理功能，逐渐成为实时数据处理的首选解决方案。本文将详细介绍 Flink 在大数据开发中的应用，并探讨其在实际业务场景中的使用优势。

#### 一、Flink简介

**Apache Flink** 是一个开源的分布式流处理引擎，最初设计用于大规模的批处理，但它最突出的特点是对实时流处理的支持。与其他流处理框架（如 Apache Storm 和 Spark Streaming）相比，Flink 以其事件驱动、低延迟和支持状态化流处理等特性而脱颖而出，成为企业实时数据处理的利器。

##### Flink 的关键特性：
1. **事件驱动的流处理**：Flink 使用的是**事件时间**（event-time）模型，允许它根据数据生成的实际时间进行处理，而非数据到达系统的时间。这种方式使得它在处理乱序数据时表现更加出色。
2. **状态管理**：Flink 提供了强大的状态管理功能，能够在流处理中保存和查询数据状态，适用于需要状态计算的场景（如聚合、窗口操作等）。
3. **Exactly-once 语义**：Flink 支持严格的一次处理语义，确保数据不会被多次处理或丢失，尤其适合金融、广告等对数据准确性要求极高的场景。
4. **批流一体化**：尽管 Flink 以流处理为主，但它也支持批处理，这使得开发者能够在同一平台上处理实时和历史数据。


#### 二、Flink 在大数据开发中的应用场景

##### 1. **实时数据分析与处理**

Flink 最常见的应用场景之一是实时数据分析。通过集成 Apache Kafka 或其他消息队列，Flink 可以实时消费数据流，并对其进行实时计算、聚合和分析。无论是处理传感器数据，还是社交媒体的流量分析，Flink 都能够帮助企业及时获取关键数据，从而做出业务决策。

**应用案例**：  
一家电商公司可以使用 Flink 实时分析用户的点击流数据，结合用户历史行为，为其提供个性化的商品推荐。这不仅提升了用户体验，还能够大大增加转化率。

##### 2. **实时风控与欺诈检测**

在金融服务领域，实时性是风控系统的关键需求。通过 Flink，企业可以实现毫秒级别的风险预警与处理，帮助银行、支付平台等金融机构监控并阻止潜在的欺诈行为。

**应用案例**：  
某支付平台通过 Flink 实时监控数百万的交易数据，并结合用户行为模式、地理位置和交易金额等因素，快速识别异常交易并发出警报。在这种高风险场景中，Flink 的低延迟和精准的状态管理显得尤为重要。

##### 3. **物联网（IoT）数据处理**

随着物联网设备的普及，处理来自大量传感器的实时数据成为了企业面临的巨大挑战。Flink 可以处理这些设备生成的海量数据流，支持实时监控、数据分析和报警系统。

**应用案例**：  
制造业中的生产线通常会部署大量的传感器，用来监控设备状态和产品质量。通过 Flink，可以实时处理来自传感器的数据，及时识别设备故障并预警，帮助工厂降低停机时间，提升生产效率。

##### 4. **广告点击流分析与竞价**

在线广告系统通常需要实时处理广告点击流，以实现竞价广告（RTB，Real-Time Bidding）的效果优化。Flink 的流处理能力帮助广告商实时分析用户的点击行为，优化广告投放策略。

**应用案例**：  
广告平台通过 Flink 实时处理海量的广告点击流数据，分析用户的浏览行为、设备类型和历史记录等，进行竞价广告的动态调整，确保每次广告展示都能带来最高的 ROI（投资回报率）。

##### 5. **流式 ETL 处理**

企业通常会使用批处理工具进行传统的 ETL（Extract, Transform, Load）操作，而随着实时数据需求的增加，企业也开始转向流式 ETL。Flink 的强大流处理能力使得它可以在数据流入系统的过程中，对数据进行转换、清洗和加载，构建实时的数据管道。

**应用案例**：  
一家零售公司通过 Flink 实时清洗来自 POS（销售点系统）的交易数据，并将清洗后的数据加载到其数据仓库中，确保业务决策层能够及时获得最新的销售数据。

##### 6. **复杂事件处理（CEP）**

复杂事件处理（CEP）是 Flink 的一项强大功能，它能够从数据流中检测出复杂的模式或事件序列。企业可以利用 CEP 来识别一系列关联事件，并根据规则触发相应的业务逻辑。

**应用案例**：  
在物流行业，Flink 可以通过 CEP 检测物流跟踪中的异常模式，如运输延误或设备故障，并及时触发报警或调整调度方案，提升物流效率。



#### 三、Flink 常见的集成与工具

##### 1. **Apache Kafka**
Flink 和 Kafka 是实时流处理的经典组合。Kafka 作为消息队列，负责存储和传输实时数据流，而 Flink 则可以实时消费来自 Kafka 的数据流，并执行复杂的计算和分析。

##### 2. **Flink SQL**
Flink 提供了强大的 SQL 查询接口，允许开发者使用标准的 SQL 语法来处理实时数据流。通过 Flink SQL，用户可以轻松查询流式数据，进行聚合、过滤等操作，而无需编写复杂的代码。

##### 3. **Flink 与 Hadoop 的集成**
尽管 Flink 主要用于流处理，但它也支持与 Hadoop 生态系统中的工具进行集成。例如，Flink 可以与 HDFS（Hadoop 分布式文件系统）集成，处理批量数据存储任务。

##### 4. **Flink 与 Elasticsearch 的集成**
对于实时数据的存储和检索，Flink 可以与 Elasticsearch 集成，将处理后的数据实时存入 Elasticsearch 中，供后续查询和可视化使用。



#### 四、Flink 在大数据开发中的优势

1. **低延迟与高吞吐量**  
   Flink 的架构设计能够在处理高吞吐量数据时仍保持低延迟。这对需要快速响应的数据密集型业务尤为重要，如广告点击分析和欺诈检测等场景。

2. **容错与一致性**  
   Flink 支持 exactly-once 语义，确保在流处理过程中不会出现重复处理或数据丢失的问题。此外，Flink 提供了容错机制，即使在节点故障时，作业也能通过重启恢复。

3. **批流一体化**  
   Flink 的批流一体化架构允许用户使用相同的 API 来处理批处理和流处理任务，减少了开发和维护的成本。


#### 五、Flink 在大数据开发中的未来前景

随着实时数据需求的不断增长，Flink 在大数据开发中的应用前景非常广阔。特别是在金融、零售、广告、物联网等需要高性能流处理的行业，Flink 提供了灵活而强大的解决方案。未来，随着 Flink 与更多 AI 和机器学习框架的集成，企业将能够进一步利用 Flink 来进行实时数据预测、模式识别等高阶任务。

#### 结论

Apache Flink 作为大数据开发中流处理的核心工具，以其高性能、低延迟和丰富的状态管理功能，正在为越来越多的企业提供实时数据处理的解决方案。无论是实时风控、物联网数据处理，还是广告点击流分析，Flink 都能够帮助企业在大数据时代做出更快、更智能的决策。</content:encoded></item><item><title>Github 的一些操作沟通中的缩写</title><link>https://blog.rockythink.work/blog/github-的一些操作沟通中的缩写</link><guid isPermaLink="true">https://blog.rockythink.work/blog/github-的一些操作沟通中的缩写</guid><description>之前使用github的时候，很少和别人合作过，都只是用来clone别人的代码，或者把自己的项目push上去，最近想把自己的blog推上astro-cn，提交PR的过程中，发现很多有意思的“黑话”缩写，网上查了一下，还有不少，所以，就粘贴过来，挺有意思的。</description><pubDate>Wed, 10 Jul 2024 00:00:00 GMT</pubDate><content:encoded>之前使用github的时候，很少和别人合作过，都只是用来clone别人的代码，或者把自己的项目push上去，最近想把自己的blog推上astro-cn，提交PR的过程中，发现很多有意思的“黑话”缩写，网上查了一下，还有不少，所以，就粘贴过来，挺有意思的。

通常，我们在 github 上最为常见的是以下这些词：

* **PR**：Pull Request，如果给其它项目提交合并代码的请求时，就说会提交一个PR。

* **WIP**：Work In Progress，如果你要做一个很大的改动，可以在完成部分的情况下先提交，但说明WIP，方便项目维护人员知道你还在 Work，同时他们可以先审核已经完成的。

* **PTAL**：Please Take A Look，请求项目维护人员进行 code review。

* **TBR**：To Be Reviewed，提示这些代码要进行审核。

* **TL;DR**：Too Long; Didn&apos;t Read，太长了，懒得看。

* **LGTM**：Looks Good To Me，通常是 code review 的时候回复的，即审核通过的意思。

* **SGTM**：Sounds Good To Me，跟 LGTM 同义。

* **AFAIK**：As Far As I Know，据我所知。

* **CC**：Carbon Copy，抄送。
---
以上主要内容摘自：&lt;a href=&quot;https://www.zhetenga.com/view/github%E4%B8%8A%E7%9A%84%E9%82%A3%E4%BA%9BLGTM%E5%92%8CWIP%E4%BB%A3%E8%A1%A8%E4%BB%80%E4%B9%88-a23ef2169.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;好折腾-生命在于好折腾&lt;/a&gt;</content:encoded></item><item><title>My App Defaults 2025</title><link>https://blog.rockythink.work/blog/my-app-defaults-2025</link><guid isPermaLink="true">https://blog.rockythink.work/blog/my-app-defaults-2025</guid><description>最近发现了 App Defaults 这个有趣的项目，而我从来没法抗拒这种类型的分享，所以这就是我的 App Defaults：</description><pubDate>Wed, 26 Mar 2025 00:00:00 GMT</pubDate><content:encoded>最近在 [Another Dayu](https://anotherdayu.com/2023/5452/) 这里发现了 [App Defaults](https://defaults.rknight.me/) 这个有趣的项目，而我从来没法抗拒这种类型的分享，所以这就是我的 App Defaults：

- Mail Client: MS Outlook
- Mail Server: Cloudflare Email Route + Lark + Outlook
- Notes: Obsidian
- To-Do: Apple Reminders
- iPhone Photo Shooting: Apple Camera + Limo
- Photo Management: Apple Photos + Synology Photos
- Calendar: Apple Calendar
- Cloud File Storage: iCloud + Synology Drive
- RSS: [Reeder](https://reederapp.com/)
- Contacts: Apple Contacts
- Browser: [Arc](https://arc.net/)
- Chat: [Telegram](https://telegram.org/) + WeChat
- Bookmarks: [GitHub Gist](https://gist.github.com/moeyua/5265cc7b43de8ddf2ea7e7808c771ef2)
- Read It Later: [Reeder](https://reederapp.com/) + [Instapaper](https://www.instapaper.com/)
- Word Processing: Obsidian
- Spreadsheets: [Numbers](https://www.apple.com/numbers/)
- Shopping Lists: Apple Notes
- Budgeting and Personal Finance: iCost
- News: [Reeder](https://reederapp.com/)
- Music: Apple music 
- Podcasts: Apple Podcasts + 小宇宙
- Password Management: [1Password](https://1password.com/)
- Code Editor: Trae
- Terminal: [Hyper](https://hyper.is/)
- Network Tool: [Surge](https://nssurge.com/)
- Launcher: [Raycast](https://raycast.com/)
- Blog Platform: [Astro](https://astro.build/) + [Vercel](https://vercel.com/)
- Code Assistant: Trae

## 一些补充和吐槽

### RSS

我依然希望每一个人都能使用 RSS 来订阅自己喜欢的内容，而不是被推送算法所控制。

### Browser

在这之前我一直在使用 Chrome，后面又用了Brave，但是 Arc 的体验让我不得不改变这个选择。我很欣赏 Arc 对于侧边栏的尝试，而且优秀的 UI 也让人爱不释手。基于 Chromium 的 Arc 也让我不用担心开发过程中的问题。我很期待 Arc 的未来。


### Surge

从去年开始我就陆续将自己的科学上网工具转向了 Surge。Surge 在 iOS 和 macOS 的协同体验非常棒，而且由于 Surge 定位是 Network Toolbox，这使得 Surge 也能完成一些简单的网络管理功能。今年 tvOS 开放了网络拓展功能后 Surge 也能够在 Apple TV 上使用，让我的看剧体验更加完美。


## 最后

我很期待看到更多人的 App Defaults，如果你也有兴趣，可以在 [App Defaults](https://defaults.rknight.me/) 这里找到更多信息。</content:encoded></item><item><title>Python 在大数据开发中的应用</title><link>https://blog.rockythink.work/blog/python-在大数据开发中的应用</link><guid isPermaLink="true">https://blog.rockythink.work/blog/python-在大数据开发中的应用</guid><description>在大数据领域，数据的处理和分析是企业决策和业务优化的核心。随着数据量的不断增长和数据类型的多样化，企业面临着如何高效处理和分析这些数据的挑战。Python 作为一种灵活、易于学习且功能强大的编程语言，逐渐成为大数据开发中不可或缺的工具。从数据采集、清洗、分析到机器学习，Python 在大数据开发的各个环节中都扮演了重要角色。本文将探讨 Python 在大数据开发中的应用及其优势，并介绍一些常见的使用场景和工具。</description><pubDate>Mon, 22 Jul 2024 00:00:00 GMT</pubDate><content:encoded>#### 引言

在大数据领域，数据的处理和分析是企业决策和业务优化的核心。随着数据量的不断增长和数据类型的多样化，企业面临着如何高效处理和分析这些数据的挑战。Python 作为一种灵活、易于学习且功能强大的编程语言，逐渐成为大数据开发中不可或缺的工具。从数据采集、清洗、分析到机器学习，Python 在大数据开发的各个环节中都扮演了重要角色。本文将探讨 Python 在大数据开发中的应用及其优势，并介绍一些常见的使用场景和工具。

---

#### 一、Python在大数据开发中的优势

1. **简洁易用**  
   Python 以其简洁的语法和良好的可读性著称，开发者无需关注复杂的底层实现，能够快速编写代码并进行数据处理。相比于其他语言，如 Java 和 Scala，Python 的开发效率更高，尤其适合数据分析和快速原型开发。

2. **丰富的大数据生态系统**  
   Python 拥有大量与大数据相关的库和工具，涵盖了数据采集、处理、分析和可视化等多个领域。无论是处理结构化数据的 Pandas，还是进行机器学习的 Scikit-learn，Python 的生态系统非常丰富。此外，Python 还与 Hadoop、Spark 等分布式大数据框架无缝集成，能够处理海量数据。

3. **广泛的社区支持**  
   Python 是全球最受欢迎的编程语言之一，拥有一个庞大且活跃的社区。开发者在使用 Python 进行大数据开发时，能够很容易地找到开源工具、解决方案和技术支持，这大大加快了开发进度。

4. **跨平台与灵活性**  
   Python 可以运行在各种操作系统上，如 Linux、macOS 和 Windows。这种灵活性使得开发者可以轻松地在不同环境中部署和运行 Python 大数据应用。

---

#### 二、Python在大数据开发中的应用场景

1. **数据采集与清洗**
   - 在大数据开发的早期阶段，数据采集和清洗是必不可少的步骤。Python 拥有强大的库支持，例如 `BeautifulSoup` 和 `Scrapy` 可以用来从网页中提取数据，`pandas` 和 `numpy` 则是清洗和转换数据的得力工具。
   - **应用案例**：Python 可以用于从社交媒体或电商网站爬取评论数据，之后通过 Pandas 进行数据的清洗和格式转换。这样的大数据预处理流程可以帮助数据科学家更快地进入分析和建模环节。

2. **分布式数据处理**
   - 对于大规模数据的处理，单机处理能力往往难以满足需求。Python 可以借助分布式计算框架如 Hadoop 和 Spark 来处理大规模数据集。
   - **PySpark** 是 Spark 在 Python 中的接口，允许开发者使用 Python 来编写 Spark 作业。通过 PySpark，Python 可以轻松处理数 TB 甚至 PB 级的数据。
   - **应用案例**：零售行业中的电商平台通过 PySpark 对每日交易数据进行批量处理，分析消费者行为，预测商品销量。这种分布式处理方式能够应对电商平台高并发、大数据量的需求。

3. **数据分析与可视化**
   - Python 在数据分析方面拥有许多优秀的工具，其中最常用的包括 `Pandas`、`Matplotlib` 和 `Seaborn`。这些工具可以帮助开发者从原始数据中提取有价值的信息，并通过可视化的方式展示数据结果。
   - **应用案例**：企业可以使用 Python 进行客户群体的划分与分析，挖掘潜在客户并分析市场趋势。通过 Matplotlib 绘制的趋势图、热力图等可视化工具，帮助企业管理者更加直观地理解数据的变化。

4. **机器学习与预测分析**
   - 在大数据的应用中，机器学习是非常重要的一环。Python 在机器学习方面的工具链十分丰富，`Scikit-learn`、`TensorFlow`、`Keras` 等库能够方便地构建和训练机器学习模型。通过这些库，开发者可以进行回归、分类、聚类等常见的机器学习任务。
   - **应用案例**：金融机构可以使用 Python 构建信用评分模型，通过分析大量的历史贷款数据，预测客户的违约风险，从而做出更好的风险控制决策。

5. **实时数据处理与流式计算**
   - 随着物联网和实时监控系统的发展，实时数据处理变得愈发重要。Python 可以通过与 Apache Kafka 和 Apache Flink 等工具集成，处理来自各种传感器和设备的实时数据流。
   - **应用案例**：在工业制造中，实时监控设备的状态和性能可以帮助企业及时预防设备故障。通过 Python 与 Kafka 集成，企业可以实时获取设备状态数据，并通过机器学习模型预测设备的维护需求，减少停机时间和成本。

---

#### 三、常见的Python大数据工具

1. **Pandas**：处理结构化数据的基础库，支持数据清洗、分析与操作。
2. **NumPy**：强大的科学计算库，能够处理多维数组和矩阵操作。
3. **PySpark**：用于在 Spark 集群上运行 Python 的库，适合分布式数据处理。
4. **Dask**：用于并行计算的 Python 库，可以处理比内存更大的数据集。
5. **TensorFlow 和 PyTorch**：流行的深度学习框架，支持分布式机器学习。
6. **Apache Kafka**：用于处理实时数据流的工具，Python 可以通过 `confluent-kafka-python` 与 Kafka 进行集成。

---

#### 四、Python在大数据开发中的未来前景

Python 由于其简单易用和强大的扩展能力，已经成为大数据开发领域的重要工具。随着大数据生态系统的不断演进，Python 与大数据技术的结合也在逐步深入，未来它将继续在数据分析、机器学习和分布式计算等方面发挥不可替代的作用。

此外，Python 社区的活跃度和不断更新的库与工具，使得 Python 能够快速适应大数据领域的新挑战和需求。企业可以通过 Python 构建灵活高效的大数据解决方案，在激烈的市场竞争中脱颖而出。

---

#### 结论

Python 作为大数据开发中的强大工具，能够帮助开发者快速处理、分析和可视化海量数据。无论是数据清洗、分布式计算，还是机器学习，Python 都能提供完善的解决方案。在未来，Python 将继续成为大数据领域的主力军，推动企业更好地利用数据进行决策和创新。</content:encoded></item><item><title>MAKE - The Indie Maker Handbook-阅读笔记</title><link>https://blog.rockythink.work/blog/makethe-indie-maker-handbook-阅读笔记</link><guid isPermaLink="true">https://blog.rockythink.work/blog/makethe-indie-maker-handbook-阅读笔记</guid><description>在没找到合适的工作之前，我想自己也不应该闲着，所以我想到了自己一直以来愿望，就是自己可以成为一名独立开发者，去做一些自己想做的事情，去创造一些自己觉得很酷的事情，这些事情最好是可以给我带来一些收入的，但如果我在以此谋生的道路上失败了，我至少不会损失什么，毕竟我在这条路上还有过收获，我相信自己一定会一直做下去的。我最近了解到pieter levels 的创业轨迹后，我觉得我的理想似乎是可以实现的，他让我重新建立的信心，所以我花了30刀购买了他写的这本独立创作者手册，我将通过一系列的文章来发表自己对这本书的看法和理解。以供大家参考。</description><pubDate>Thu, 24 Oct 2024 00:00:00 GMT</pubDate><content:encoded>## 目录

待定

## 整体介绍

按照我我习惯，我拿到一本此类的书后，会先看下目录，这会让我在阅读的过程中更加流畅，避免很多疑惑。</content:encoded></item><item><title>cloudflare pages 博客搜索功能无法使用的问题</title><link>https://blog.rockythink.work/blog/cloudflare-pages-博客搜索功能无法使用的问题</link><guid isPermaLink="true">https://blog.rockythink.work/blog/cloudflare-pages-博客搜索功能无法使用的问题</guid><description>cloudflare pages 博客搜索功能无法使用的问题，主要来源于设置了js的内容加速，解决方案如下</description><pubDate>Fri, 15 Mar 2024 04:53:19 GMT</pubDate><content:encoded>最近在折腾`cloudflare pages`，大家都觉得这个不够快，我尝试了一下，速度还是可以接收的。能够开启的优化项又很多，那当然是开启所有可以免费开启的优化项了呀。

所以，就出现了在博客页面的搜索功能无法使用的问题。

其实这个原因是因为开启了`Rocket Loader™`导致的，关闭之后立马就能看到问题被解决了，我相信其他的一些javascript不能被执行的原因也大概是如此。

`Rocket Loader™`配置位置：速度-&gt;优化-&gt;内容优化-&gt;Rocket Loader™

我们可以关闭它
当然关闭之后，肯定会影响到网站的访问速度。怎么办呢，cloudflare给我们提供了解决方案。

不用关闭Rocket Loader™，两个办法：

1. 配置 Configuration Rules 
    我们可以免费配置10个这样的规则，配置项也更加灵活
   ![17104501515530](https://s2.loli.net/2024/03/15/dIHSu6vp5XnAFJB.jpg)

    然后在下面的 `则设置将为…` 中找到 `Rocket Loader`
    点击右边的添加，左边的开关为关闭状态就好
    如下图
    ![17104503160903](https://s2.loli.net/2024/03/15/3CZYfSMugyN8KsR.jpg)
    
    这样，我们在去到 /search 这个路径下，javascript代码就不会被压缩优化，导致功能无法使用的问题了。

2. 配置页面规则
    后面还有一个页面规则，也可以达到这个效果，但是我们只能免费配置三个页面规则
    配置如下图，其实道理是一样的
    ![17104506425063](https://s2.loli.net/2024/03/15/3YJPqUsxjfkiwG5.jpg)
    
    我这里就不多做赘述了。

好了，希望这个分享能解决你的问题。

祝好</content:encoded></item><item><title>《草台班子是如何运行的？——陈一枝》观后感</title><link>https://blog.rockythink.work/blog/草台班子是如何运行的陈一枝观后感</link><guid isPermaLink="true">https://blog.rockythink.work/blog/草台班子是如何运行的陈一枝观后感</guid><description>最近看了油管上的这个视频，很有趣，因为我在国内的某个大厂工作过一段时间，参与的项目大大小小也有一些，所以，这个视频我反复看了好几遍，内容虽然毫无客观可言，但基本上都对上了我的经历，所以分享出来给大家乐和乐和。</description><pubDate>Tue, 16 Jul 2024 00:00:00 GMT</pubDate><content:encoded>最近看了油管上的这个视频，很有趣，因为我在国内的某个大厂工作过一段时间，参与的项目大大小小也有一些，所以，这个视频我反复看了好几遍，内容虽然毫无客观可言，但基本上都对上了我的经历，所以分享出来给大家乐和乐和。

好了，由于这个视频的例子和B站有关，所以B站上这个视频已经下架了，但在youtube 上还是可以看到的

先放个链接，大家有条件的可以自己去看。
&lt;a href=&quot;https://www.youtube.com/watch?v=t4vSzN2QDrE&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;视频链接&lt;/a&gt;

**也可以在这里直接看**

&lt;div style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; height: auto;&quot;&gt;
&lt;iframe style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot; src=&quot;https://www.youtube.com/embed/t4vSzN2QDrE&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

对了，看不了的，我也把视频下载下来了，大家在云盘上看吧

&lt;a href=&quot;https://www.alipan.com/s/iGtHXGZJkQM&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;点击这里观看哈&lt;/a&gt;

## 下面是观后感的部分：

在职场中，我们时常会听到“草台班子”这个说法，用来形容那些由外行领导内行、组织松散、缺乏专业能力的团队。这类团队表面上在运作，实际上由于目标不同、信息不对称、认知差异和个人习惯的冲突，导致合作难以顺利进行。

#### **1. 目的不同**
作为基层员工，很多人会将工作目标集中在如何提高产品或服务的质量，但老板可能更多考虑如何快速应对投资人的需求，甚至趁热打铁，迅速从市场中获利。因此，目标上的不同常常使得项目执行出现分歧，甚至导致失败。

#### **2. 信息差与沟通障碍**
在工作中，每个人获取的信息量往往不一致。有些同事或上级可能会隐瞒关键信息，或者觉得某些信息不必分享，这使得团队内部对于同一问题的认知各异，进而影响项目的决策和推进。信息的不对称成为很多团队合作失败的关键因素之一。

#### **3. 认知差异**
不同的人对同一件事的理解可能完全不同，甚至在事实面前，大家看到的只是冰山一角。这种认知上的不一致使得团队成员在面对问题时难以达成共识，进一步加大了沟通和执行的难度。

#### **4. 习惯的磨合**
每个人都有自己的工作方式和习惯，但在一个团队中，个人的工作习惯如果不能很好地磨合，往往会导致效率下降，甚至矛盾升级。因此，习惯的差异也是“草台班子”工作难以推进的原因之一。

### **如何应对？**
虽然草台班子在职场中并不少见，但作为职场人，我们可以采取以下策略：
1. **接受现实**：很多时候，无法改变的环境就是现状，接受并适应是第一步。
2. **明确责任边界**：与团队或上级明确责任划分，避免因工作失误被推诿。
3. **做事留底**：记录工作过程，避免事后争议或推卸责任。
4. **风险预报**：及时汇报潜在风险，并提出解决方案或留出应对空间。

### **总结**
职场中的“草台班子”现象常常是管理者用人不当或信息不透明造成的结果。在这种环境下，做好自己的本职工作，明确责任边界，并保持对工作结果的关注，可以在一定程度上避免被拖入职场纷争中。</content:encoded></item><item><title>【Cloudflare】服务精解_引言</title><link>https://blog.rockythink.work/blog/cloudflare服务精解_引言</link><guid isPermaLink="true">https://blog.rockythink.work/blog/cloudflare服务精解_引言</guid><description>无论是域名还是博客，我都是搭建在cloudflare上的，即便是家里的NAS，外网的访问也是通过Cloudflare来完成原因其实很简单，主要就是他免费为我提供的安全和高效，而我有什么理由不去相信他呢，但惭愧的是，我和大部分人一样其实懂得的网络和站点之类的只是也都是七七八八，没有系统的学习过，未来也打算一直使用Cloudflare，所以我觉得自己有必要把Cloudflare中的各个服务功能详细了解一下，当然由于资金问题，收费的功能无法体验。 不过免费的功能我相信也能满足大部分的需求了</description><pubDate>Wed, 12 Jun 2024 00:00:00 GMT</pubDate><content:encoded>无论是域名还是博客，我都是搭建在cloudflare上的，即便是家里的NAS，外网的访问也是通过Cloudflare来完成原因其实很简单，主要就是他免费为我提供的安全和高效，而我有什么理由不去相信他呢，但惭愧的是，我和大部分人一样其实懂得的网络和站点之类的只是也都是七七八八，没有系统的学习过，未来也打算一直使用Cloudflare，所以我觉得自己有必要把Cloudflare中的各个服务功能详细了解一下，当然由于资金问题，收费的功能无法体验。
    不过免费的功能我相信也能满足大部分的需求了

&gt; 先需要有一个cloudflare账号，这个我就不介绍了，我们直接看服务

## 我们先从首页看起来吧</content:encoded></item><item><title>【数据安全】离线数仓的数据安全理解（未完待续）</title><link>https://blog.rockythink.work/blog/数据安全离线数仓的数据安全理解未完待续</link><guid isPermaLink="true">https://blog.rockythink.work/blog/数据安全离线数仓的数据安全理解未完待续</guid><description>数据安全在离线数据仓库（离线数仓）中尤为重要，因为它涉及到大量敏感数据的存储、处理和分析。离线数仓通常用于存储历史数据和进行复杂的批量处理，因此需要采取严格的安全措施来保护数据的完整性和机密性。</description><pubDate>Mon, 03 Jun 2024 00:00:00 GMT</pubDate><content:encoded>## 前言
数据安全在离线数据仓库（离线数仓）中尤为重要，因为它涉及到大量敏感数据的存储、处理和分析。离线数仓通常用于存储历史数据和进行复杂的批量处理，因此需要采取严格的安全措施来保护数据的完整性和机密性。

首先，访问控制是数据安全的关键。只有授权人员才能访问和操作数据，确保敏感信息不会被未经授权的人员获取。其次，数据加密在传输和存储过程中也是必不可少的，以防止数据被窃取或篡改。此外，定期进行安全审计和监控，可以及时发现和应对潜在的安全威胁。

此外，数据备份和恢复机制也是离线数仓数据安全的重要组成部分。通过定期备份数据，可以在数据丢失或损坏时及时恢复，确保业务的连续性。最后，员工的安全意识培训也是不可忽视的一环，确保所有相关人员都了解并遵守数据安全的最佳实践。

## 具体措施
在过去的几个数据中台的项目中，我们不难注意到客户对数据安全的重视程度是非常大的，一些客户甚至会为了数据安全，在数据中台的建设阶段就开始将数据安全实行在其中，这有时也会让作为乙方的我非常痛苦，这将会大大降低数据开发的复杂度，当值项目延期等风险。

所以，我们在做项目的同时，一般都会结合客户对数据安全的敏感程度，在开发效率和数据安全两边做好平衡，尽可能的减少两者之间的互相影响。

### 一、访问控制
我们知道，对于一个相对完整的数据团队来说，会有不同角色参与其中。所以我们需要先对整个开发团队的各角色有清晰的认识，然后再从角色中对应不同的数据访问权限，当然在开发中的不同阶段，也会对数据安全有相应的不同的调整。

首先，一般都会有哪些角色呢？

**1、主Owner**

一个团队中，一定是需要一个主要的技术负责人，来对整体做把控的，相当于超管，他对数据有完整的访问权限，但他的主要工作是对项目代码及数据的review或者测试，他一般不会开发任何数据处理脚本，所以对他来说，他并不需要数据处理脚本发布权限，尽管他可以为自己分配这个权限，但我认为这是一个安全意识问题，权责要对等，不然会出问题。

**2、数据源管理**

数据中台的数据来源一般来自与各个业务系统，那么这些业务系统中的数据肯定不是都需要的，最为敏感的例子就是用户密码（虽然现在的大部分用户密码都是密文存储），一旦泄密，会对业务系统的安全性产生威胁。

所以对于数据源管理员来说，需要遵循最小化原则，必要的数据才会被作为数据中台的数据源接入，下游的开发任务如果有需要，可以对数据源管理提交申请，进行仔细的安全及必要性评估后，再对其进行接入。

**3、数据开发**

在数据源接入后，就需要对数据进行处理，或者说是开发工作了。

在这之前，所有参与数据开发的人员中，他们的负责的部分需要有明确的边界，我们可以横向来划分不同开发人员，也可以纵向划分。

所谓横向划分，就是在数据建模后，根据模型，以及预设的数据血缘，尽量不同的人负责不同的分支，那么这些分支所用到的数据源表，以及有中间表，都有其访问或者开发权限。

纵向划分，如同我们将开发团队对应数据仓库的分层进行分配(ODS,CDM,ADS)

。。。
不多做赘述了，总之，还是最小化原则，开发者对数据的权限需要是必要的，且开发权限尽可能互不干扰。

**3、数据测试**

我们知道，数据测试至关重要，只有通过数据测试的数据才会被对外输出，那么数据测试阶段，不同的测试人员会有不同的数据访问权限，将测试中遇到的问题，提交给开发对应的开发人员进行核查及修复。这个过程中，开发角色的权限不变，测试人员则需要对其负责测试的部分拥有完整的数据访问权限。等测试结束后，权限收回。
当然，测试人员可能还需要拥有外部的数据权限，这我会在关于数据测试的文章中说明。

**4、数据分析**


（未完待续）

See you</content:encoded></item><item><title>【数据质量】使用Sifflet 获得可靠的数据</title><link>https://blog.rockythink.work/blog/数据质量使用sifflet-获得可靠的数据</link><guid isPermaLink="true">https://blog.rockythink.work/blog/数据质量使用sifflet-获得可靠的数据</guid><description>最近在看国外最近都有哪些新的大数据相关技术，无意中发现Sifflet这个工具，简单研究了下，结合海外的其他文章写点总结</description><pubDate>Sun, 09 Jun 2024 00:00:00 GMT</pubDate><content:encoded>数据中台有一个非常重要的作用，就是做数据分析和支持决策的重要依据，而数据从业务系统等数据源入仓后，会经过几层甚至几十层的转换传递，这其中任何一个环节出现问题，都会导致被依赖数据的连锁反应，最终到达分析和决策层后，带来的影响不容小觑，这也是我们在大数据工作中，把数据测试的排期拉的甚至比开发时间还要长的重要原因！

我们要确保数据的准确性、一致性、完整性和及时性，以帮助公司做出明智的决策。由于发现了工具，研究了一下如何使用数据可观察性平台 Sifflet 来监控数据质量的。

## 为什么要监控数据质量？

数据质量是指数据在特定时间点的健康状况。以下标准可用于监测数据：完整性、唯一性、有效性、一致性、准确性和完整性。这里我就不做赘述了，相信从事数据开发相关工作的，对这些都并不陌生。

不过为了连贯，我还是通俗得阐述下他们的含义：

* 完整性：测试对象是否拥有所有数据？
* 唯一性：同一ID 是否对应了不同的实体？
* 一致性：不同的数据来源中的相同业务含义的数据是否一样？
* 准确性：数据的计算是否正确，数据转换过程中是否有精度损失等？
* 完整性：数据是否被替换或者篡改？

良好的数据质量对公司来说至关重要。

在处理大量数据时，必须实现质量控制自动化。Sifflet 平台是监控大量数据的理想解决方案。

## 什么是 Sifflet？

Sifflet 是一个全栈数据可观察性平台，使企业能够信任其数据，从而大规模地提供可操作的见解。重要的是要明白，数据可观察性并不等同于数据监控。Sifflet 平台有三大特点，随后我在介绍

![Sifflet 平台示例](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240609024220.png)

### 数据可观察性和数据监控之间有何区别？

数据监控能够识别一组预定义的故障模式。而数据可观察性则更进一步，因为它有助于了解事件的源头。总之，数据监控属于数据可观察性的范畴。

### Sifflet 可能被应用在什么地方？

* 监控和监测数据是否符合数据质量标准，确保数据质量；
* 通过数据血缘关系，来调查数据问题带来的影响
* 利用数据地图（目录）和元数据，轻松浏览数据并更好地理解数据

什么是数据血缘？它是一种数据传递流程，可让您创建一张地图，显示数据的起源和所经历的阶段。

![数据血缘示例](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240609024734.png)

## 零售项目数据质量使用案例

我从一遍博客中看到了这个案例，分享出来，大家共同学习一下

### 项目背景
数据从各种来源收集，并放入数据仓库。这些数据都是未经转换的原始数据。检索数据后，使用 DBT（数据构建工具）对数据进行转换。最后，数据分析师使用这些转换后的数据为用户创建仪表盘。

下面是实施Sifflet之前的数据管道架构
![20240609024950](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240609024950.png)

什么是 DBT？它是一种基于 Python 的开源环境，用于通过 DBT 测试进行数据管道和数据质量的数据转换。下文将详细介绍 DBT。

### 问题以及解决方案

问题：数据管道不包括任何数据质量检查。这可能会造成令人尴尬的后果，例如显示不完整或不正确的仪表盘。这就是选择可观察性平台 Sifflet 的原因。

Sifflet 与数据处理管道并行连接，以便在每个阶段检查数据质量是否正确。

实施Sifflet之后的数据管道架构
![20240609025311](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240609025311.png)

## 如何使用 Sifflet 提高数据质量？

在 Sifflet 上创建监控规则简单快捷。具体步骤如下：
首先，您需要将 Sifflet 连接到数据源。有关如何安装新数据源的更多详情，我建议查阅 Sifflet 文档，其中介绍每个步骤。

![20240609025424](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240609025424.png)


然后，在 &quot;Monitors &quot;选项卡中，可以在所需表格上创建新的监控规则。不要忘记配置规则的执行和通知。
![20240609025602](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240609025602.png)


如果出发了预定的事件，可以在 &quot;incidents &quot;选项卡中查阅，然后将其分配给自己。呈现数据生命周期的 &quot;数据血缘 &quot;有助于了解问题的起源，从而解决问题。
![20240609025622](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240609025622.png)

## 总结

虽然还没有实际在项目中使用过这个产品，但似乎这将会是一个非常有用的工具，这其中的功能其实和Dataphin很像，Dataphin毕竟是一个功能复杂庞大的系统，很多功能要和其他的模块相融合，无法真正做到某一件事情的“纯粹”，我不知道我是否表达清楚，什么都有，就会有所取舍和妥协，如果只做一个事情，比如只做数据监控，那么事情才能做到极致。

所以我非常希望有机会可以做项目中使用一下这个工具。

好啦，同志们如果也想试试，不妨去官网看看哈。

## See you</content:encoded></item><item><title>【离线数仓】我们为什么需要拉链表【与快照表的对比】</title><link>https://blog.rockythink.work/blog/离线数仓我们为什么需要拉链表与快照表的对比</link><guid isPermaLink="true">https://blog.rockythink.work/blog/离线数仓我们为什么需要拉链表与快照表的对比</guid><description>快照表和拉链表是两种用于存储数据历史的常见表结构，它们的目的都是记录数据的变化，但实现方式和适用场景有所不同。下面从多个角度对比它们，解释为什么在某些情况下需要使用拉链表。</description><pubDate>Wed, 25 Sep 2024 00:00:00 GMT</pubDate><content:encoded>**快照表**和**拉链表**是两种用于存储数据历史的常见表结构，它们的目的都是记录数据的变化，但实现方式和适用场景有所不同。下面从多个角度对比它们，解释为什么在某些情况下需要使用拉链表。

### 1. **数据历史追踪**
- **快照表**：记录特定时间点的数据快照，每次更新时生成一份完整的快照。每个快照代表某个时刻的数据状态，但无法方便地看到某一条记录在历史上的具体变化过程。
- **拉链表**：通过 `start_date` 和 `end_date` 字段明确记录每条数据的生效和失效时间，保留了每条记录的历史变化情况。

**为什么需要拉链表**：
- 快照表只能展示某个时间点的完整数据状态，但无法追踪一条记录的变化过程。拉链表则能够精准地跟踪每条记录的变化历史，帮助分析数据如何演变。

### 2. **数据存储效率**
- **快照表**：每次数据更新时，快照表会记录下整个数据集的副本。随着时间推移和数据量增长，存储空间需求迅速增加。特别是当数据变化较少时，每次快照大部分数据可能都是重复的。
- **拉链表**：只记录数据发生变化的部分，并用时间段表示数据的有效性，从而减少了冗余数据的存储需求。

**为什么需要拉链表**：
- 快照表可能会存储大量冗余的重复数据。拉链表只记录变化部分，避免重复存储，能够显著节省存储空间，特别是在数据量很大的场景中。

### 3. **查询效率与复杂性**
- **快照表**：查询某个时间点的数据比较简单，因为每个快照都是完整的数据副本。但是如果需要查询数据的变化过程，或者跨多个时间点的变化，则需要遍历多个快照进行比对。
- **拉链表**：拉链表通过 `start_date` 和 `end_date` 的时间戳字段，能够方便地查询某条记录在某个时间点的状态，以及记录如何变化。而且查询数据的历史变化比较直观，不需要跨多个时间点进行比对。

**为什么需要拉链表**：
- 快照表在需要进行历史数据分析时，查询成本较高。而拉链表设计清晰，查询某条记录的变化过程相对简单，特别适合需要频繁查询历史变化的业务场景。

### 4. **数据更新方式**
- **快照表**：快照表是通过生成完整的副本来实现数据的记录，不会涉及到记录的修改。每次更新时，直接生成一份新的快照。
- **拉链表**：拉链表则需要对数据进行更新，当某条记录发生变化时，旧记录的 `end_date` 会被修改为变化发生的时间，同时插入一条新的记录。

**为什么需要拉链表**：
- 在需要保留数据的历史变化记录时，快照表只能通过新增副本来实现，而拉链表通过更新记录的有效时间可以更好地跟踪数据变化，同时不需要重新存储大量重复数据。

### 5. **适用场景**
- **快照表**：适用于那些只关心某个时间点完整数据的场景，比如每天的定期报表生成，或业务数据的周期性快照。这类场景下不需要了解具体记录的历史变化，只需要查看特定时刻的数据状态。
- **拉链表**：适用于需要精确追踪数据变化的场景，特别是维度表（如用户、产品、组织结构等）的变化记录。在涉及审计、合规、数据回溯等场景中，拉链表能够帮助保留每个数据点的详细变化过程。

**为什么需要拉链表**：
- 快照表适合定期查看完整数据，但在需要追踪某条数据的详细变化历史时，快照表并不方便。拉链表在需要分析或审查某个对象的历史变更时非常有效。

### 6. **数据版本管理**
- **快照表**：适合存储数据的静态副本，能够提供不同时期的整体快照，但无法直观显示某条数据的版本变化。
- **拉链表**：提供了更精细的数据版本控制，能够清晰显示某条记录在不同时间段内的多个版本。

**为什么需要拉链表**：
- 在需要进行数据版本管理，或者基于数据的不同版本做分析时，拉链表能够更方便地查询和追踪某条记录的版本变化，而快照表则需要更多的手工操作来比对不同版本的差异。

---

### 总结

拉链表在需要**追踪数据历史变化**、**节省存储空间**、**提高查询效率**以及**进行数据版本控制**的场景下，优势明显。相比快照表，拉链表能够提供更详细的历史信息，适用于需要精确记录和查询数据变化过程的场景。</content:encoded></item><item><title>一个小故事让你明白大数据在企业中的核心价值</title><link>https://blog.rockythink.work/blog/一个小故事让你明白大数据在企业中的核心价值</link><guid isPermaLink="true">https://blog.rockythink.work/blog/一个小故事让你明白大数据在企业中的核心价值</guid><description>这是一个虚构的小故事，旨在为大数据领域的初学者提供一些基础性的逻辑思维框架。尽管其内容可能不够严谨，但我认为首先构建一个基本框架是非常重要的，之后可以逐步完善和补充细节。</description><pubDate>Tue, 25 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&gt; 这是一个虚构的小故事，旨在为大数据领域的初学者提供一些基础性的逻辑思维框架。尽管其内容可能不够严谨，但我认为首先构建一个基本框架是非常重要的，之后可以逐步完善和补充细节。

### 一、从前的小作坊时代

很久很久以前，在没有互联网的世界里，商业就像一个个小小的岛屿。经济发展慢悠悠的，市场竞争也不激烈，不同地区的市场彼此几乎没什么往来。
有一位名叫老陈的小老板，他经营着一家小杂货店。每天清晨，他都会站在店门口，望着街道，凭着自己多年的经验和直觉来做决策。“去年冬天卖得最好的就是那些厚实的围巾，今年这个时候也肯定差不了。”老陈心里想着，便多进了些围巾的货。
老陈也会用一些简单的数据来辅助自己，他有一个破旧的本子，上面记录着每天的销售情况和库存清单。这些数据都是他亲手用铅笔写上去的，虽然简单又少，但对他来说已经足够了。他会仔细地查看本子，看看哪种商品卖得好，哪种卖得不好，然后根据这些来调整进货的数量。在那个时代，像老陈这样的老板们大多都是依靠着自己的经验和直觉，再加上一点点简单的数据，就这么经营着自己的生意。
### 二、互联网来袭，商业世界大变样

突然有一天，互联网像一阵狂风，席卷了整个商业世界。地域的界限被彻底打破，全国甚至全球的商家都成了竞争对手。消费者们也不再像以前那样只能被动接受本地商家的产品，他们有了更多的选择。市场就像一个快速旋转的大转盘，今天流行的东西，明天可能就过时了。
有一家叫“梦想服饰”的公司，原本只是一家在本地小有名气的服装店。互联网的到来让他们面临着前所未有的挑战。公司的老板李总心急如焚，他发现自己的生意越来越难做了。不知道自己的衣服在市场上到底处于什么位置，也不清楚顾客真正想要什么样的款式，更不知道竞争对手在搞什么花样。李总感觉自己就像一个在黑暗中摸索的人，找不到方向。
后来，李总听说了数据的重要性。他意识到，要想在这个新的商业世界中生存下去，就必须了解市场、了解客户、了解竞争对手，而这一切都需要通过数据来实现。于是，李总开始收集各种数据，包括顾客的购买记录、浏览记录、反馈意见等等。数据就像一双明亮的眼睛，让“梦想服饰”逐渐看清了前方的道路。他们根据数据调整了服装的款式和颜色，推出了更符合顾客需求的产品，生意也渐渐有了起色。
### 三、Excel时代的小能手

在数据刚刚开始发挥作用的时候，有一位名叫小张的小店老板。他的店虽然不大，但每天也有不少的生意。小张想要更好地了解自己的生意情况，于是他想到了用Excel表格来分析数据。
每天晚上，小张都会坐在电脑前，打开Excel表格，认真地记录当天的销售情况。他会统计每个产品的销量，然后做一个简单的图表，看看销售趋势。有一天，小张发现这个月的销量比上个月下降了10%。他仔细查看图表，发现原来是一款夏季的短袖卖得不好了。经过一番调查，他发现市场上出现了竞争对手的新款短袖，款式更时尚，价格也更便宜。小张心想：“看来得调整一下进货策略了。”同时，他通过分析数据预测到冬季的保暖产品销量会上升，于是提前备好了货。
小张的这些分析结果对他的生意非常有用。他根据数据调整了营销策略，比如对卖得不好的产品进行打折促销；采购人员根据数据调整了库存，避免了积压；工厂也根据数据调整了生产计划，提高了效率。这就是[[数据运营岗位简介]]的雏形，用数据来指导业务决策。
### 四、数据库时代的英雄登场

随着“梦想服饰”公司的业务不断扩大，数据量也越来越大。公司的运营人员小李发现，以前用的Excel表格越来越不好用了。文件变得越来越大，打开一次都要等好久；数据太多，分析起来非常复杂，而且多人协作的时候很容易出错。更麻烦的是，现在需要记录的数据类型也越来越多，不仅有销售数据，还有顾客的基础信息、浏览行为、加入购物车但没买的记录等等。
就在大家一筹莫展的时候，公司请来了一位数据库专家老王。老王带来了数据库这个神奇的工具。数据库就像一个超级大仓库，性能非常好，可以处理大量的数据。而且，它可以用SQL语言高效地查询和分析数据，多人还可以同时访问和操作，数据的安全性也更高。
小李和同事们不用再在Excel里点来点去了，他们跟着老王学习写SQL代码。只要写几行代码，就能得到想要的结果。数据库的出现，让“梦想服饰”公司的数据管理和分析变得更加高效和准确。
### 五、数据仓库来拯救混乱

时间一天天过去，“梦想服饰”公司数据库里的数据越来越多，新的问题又出现了。数据质量参差不齐，有些数据不准确或者缺失，就像一堆杂乱无章的拼图，很难拼凑出完整的画面。同一个信息可能分散在不同的表甚至不同的数据库中，每次分析都要写很长的SQL，还要处理各种异常情况。
有一次，市场部的小赵想要分析一款新款连衣裙的销售情况。他发现商品信息在A表，价格信息在B表，销售记录在C表，而且C表中的商品ID和A表的还不一致。小赵忙了一整天，也没得到一个准确的结果。
公司意识到，需要一个更好的解决方案。于是，他们请来了数据仓库专家林姐。林姐就像一个神奇的整理师，她把各种数据整理好，放在一起。她把那些不准确的“脏数据”清洗干净，把分散的数据整合起来，按照商品、用户、订单等主题组织数据。
这样一来，分析数据就方便多了。小赵想要分析商品，就去商品主题表；想要分析用户，就去用户主题表。写的SQL简单多了，结果也更准确。通过数据仓库，“梦想服饰”公司的数据变得更加有序，分析效率也大大提高。
### 六、大数据时代的挑战与应对

随着互联网的进一步发展，数据量就像决堤的洪水一样，呈爆炸式增长。电商平台每天产生的订单数以百万计，社交媒体每秒产生的内容数以万计，物联网设备每分钟产生的数据数以GB计。
“梦想服饰”公司也面临着巨大的挑战。他们发现，传统的数据库已经跑不动了。查询一个简单的统计可能需要几小时，有些复杂查询甚至无法完成，系统经常崩溃或超时。
在这个关键时刻，公司请来了数据开发专家刘哥。刘哥带来了一批新技术，比如Hadoop、Hive和Spark。Hadoop就像一个超级大的分布式存储系统，可以在普通电脑组成的集群上存储和处理海量数据；Hive让大家可以用类似SQL的语言查询Hadoop中的数据；Spark则是比Hadoop更快的数据处理引擎。
这些技术有很多优点，数据和计算分散在多台机器上，具有分布式的特点；需要更多性能时，只需添加更多机器，可扩展性很强；部分机器出问题，整个系统仍然能工作，容错性也很高。刘哥教会了大家如何使用这些新技术，让“梦想服饰”公司能够应对海量数据的挑战。
### 七、数据治理的重要使命

随着数据越来越多，越来越重要，新的问题又出现了。数据质量方面，如何确保数据准确可靠？数据安全方面，如何保护顾客的敏感信息不被泄露？数据权限方面，谁能看什么数据，谁能修改什么数据？数据标准方面，如何统一数据的定义和格式？
“梦想服饰”公司的高层意识到，如果这些问题不解决，后果将不堪设想。可能会基于错误数据做出错误决策，数据泄露会带来法律和声誉风险，数据使用混乱会导致效率低下。
于是，公司组建了一个专业的数据治理团队。团队里有负责建立数据质量监控机制的张工，他就像一个严格的质检员，及时发现和修复数据中的问题；有负责实施数据安全措施的李工，他像一个忠诚的卫士，保护着公司的敏感数据；有负责制定数据访问权限规则的王工，他确保数据的合规使用；还有负责统一数据标准和定义的赵工，他避免了数据的混淆。
### 八、数据架构师的宏伟蓝图

最后，“梦想服饰”公司还需要一个总设计师，来规划整个数据体系。公司请来了经验丰富的数据架构师陈总。陈总就像一位伟大的建筑师，他设计数据如何收集、存储、处理和使用。他会选择合适的技术工具和平台，制定数据相关的标准和规范，确保整个数据体系能够支持公司的业务需求。
在陈总的带领下，“梦想服饰”公司的数据生态系统变得更加完善和高效。公司的业务也因为数据的合理利用而蒸蒸日上。
### 总结

从最初的小本子记录，到Excel表格、数据库、数据仓库，再到大数据平台和数据治理，大数据的发展历程就像一场奇妙的冒险之旅。在这个过程中，不同的角色都发挥着重要的作用，他们共同推动着商业世界的发展和进步。无论是数据领域的新手，还是有经验的从业者，了解这个发展历程都能更好地理解大数据的本质和价值。</content:encoded></item><item><title>人工智能真的在帮助人类进步吗？（我对AI未来发展的担忧）</title><link>https://blog.rockythink.work/blog/人工智能真的在帮助人类进步吗我对ai未来发展的担忧</link><guid isPermaLink="true">https://blog.rockythink.work/blog/人工智能真的在帮助人类进步吗我对ai未来发展的担忧</guid><description>近期，我们明显感受到人工智能创作的内容遍布各个角落。从文稿至图像，再到视频制作，其速度之快令人咋舌。虽然看似无关痛痒，但实际上背后隐藏诸多问题。人工智能所产出的内容日益增多，不禁让人忧虑互联网的未来将走向何方。</description><pubDate>Sat, 07 Sep 2024 00:00:00 GMT</pubDate><content:encoded>近期，我们明显感受到人工智能创作的内容遍布各个角落。从文稿至图像，再到视频制作，其速度之快令人咋舌。虽然看似无关痛痒，但实际上背后隐藏诸多问题。人工智能所产出的内容日益增多，不禁让人忧虑互联网的未来将走向何方。

首先，我们必须面对一个事实：人工智能创作的内容往往缺乏新意。不论生成多少文本或图像，缺少的始终是那种独树一帜的创造性和个性化语言。人工智能的本质在于“模拟”，即依托现有内容进行再创作，而非人类的原创性劳动。这意味着，我们将越来越多地看到雷同和肤浅的内容。试想，若浏览的网页文章观点均大同小异，缺乏新颖思想和打动人心的元素，对读者来说无疑是一场灾难。

其次，人工智能生成的内容真实性难以保证。它们所生产的新闻和图像，初看之下与真品无异，实则未经任何审核。我们如何判断这些信息的真实性？人类历经千年构建的信任体系，可能在人工智能的几个操作下土崩瓦解。这不仅可能导致我们对网络信息失去信心，还可能为误导行为提供新工具。

更让我忧虑的是，随着人工智能生成内容的增加，它们将被用于训练新一代AI模型。换句话说，这些内容最终可能成为人工智能自我学习的“食粮”。问题是，如果人工智能仅从自身创作的内容中学习，其质量是否会每况愈下？内容是否会变得越来越空心化？这就好比一个人长期只阅读自己的日记，其思想必将愈发狭隘。

对于广大用户而言，这种现象更是暗藏风险。每天沉浸在大量人工智能生成的内容中，我们可能逐渐丧失辨别优质内容的能力，越来越依赖这些自动化产出，不再愿意思考和剖析。当人工智能主导了我们的关注点，那些真正值得深思和价值连城的内容或许将湮没无闻。

我尤为担忧的是：文化多样性是否会因此受损？人工智能创作的内容通常基于海量现有数据，而这些数据大多源自主流文化。如果一切内容均由人工智能生成，个性化的表达与不同文化间的交流碰撞是否会不复存在？最终，我们可能面临的是一个单调乏味、缺失多元文化的互联网，思想丰富性也将不复存在。

归根结底，我担忧人工智能生成的内容是否会成为我们发展的绊脚石？人类的创造力与独立思考能力是社会进步的关键，然而，一旦过度依赖这些机械生产的内容，我们是否会逐渐丧失这些宝贵的能力？未来的互联网是否将被充斥着缺乏灵魂的人工智能内容？这些问题值得我们深入反思。

人工智能技术为我们带来了众多便利，但同时也引发了对互联网未来走向的质疑。人工智能生成的内容究竟是未来的大势所趋，还是正在侵蚀我们最珍贵的东西——真实、创意以及独立思考的能力？这或许是我们这个时代必须直面的一大挑战。

## 讽刺的是：这篇文章也借助了AI的帮忙。。。

![20240907020043](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240907020043.png)

欢迎大家讨论</content:encoded></item><item><title>作为前员工，对阿里瓴羊业务的理解</title><link>https://blog.rockythink.work/blog/作为前员工对阿里瓴羊业务的理解</link><guid isPermaLink="true">https://blog.rockythink.work/blog/作为前员工对阿里瓴羊业务的理解</guid><description>在国内，过去几年中大数据底层技术的发展并没有发生显著变化，很多服务提供商的产品同质化严重，竞争也集中在价格和短期服务上。然而，仅靠短期的项目或服务维持盈利显然是不现实的，企业必须为客户提供长期、持续的服务，才能建立真正的竞争优势。鉴于我也曾经是瓴羊的一分子，我认为瓴羊的未来发展需要从多个层面进行优化与调整。</description><pubDate>Fri, 20 Sep 2024 00:00:00 GMT</pubDate><content:encoded>#### 一、大数据行业的现状与挑战

近年来，大数据行业在ToB市场中的表现仍具有一定的市场规模。然而，随着越来越多的企业开始提供数据服务，行业内的竞争也日益激烈，产品和服务的质量参差不齐。客户对大数据技术的理解和需求各有不同，整体的认知成熟度还远未达到预期。

在国内，过去几年中大数据底层技术的发展并没有发生显著变化，很多服务提供商的产品同质化严重，竞争也集中在价格和短期服务上。然而，仅靠短期的项目或服务维持盈利显然是不现实的，企业必须为客户提供长期、持续的服务，才能建立真正的竞争优势。在这样的背景下，我认为瓴羊的未来发展需要从多个层面进行优化与调整。

#### 二、打磨核心产品：简洁与功能的平衡

作为曾在瓴羊工作的从业者，我对其产品如Dataphin和QuickBI有着深刻的理解。从技术功能的角度来看，瓴羊的产品在市场上已经处于领先地位，Dataphin的功能非常丰富，能够满足复杂的数据管理需求。然而，过多的功能也带来了产品理解成本的上升，尤其是对于客户来说，他们往往无法快速掌握产品的核心功能。

在我看来，工具的本质应是简洁实用的。尽管产品功能强大，但用户往往只需要其核心部分来解决问题。如果产品过于复杂，不仅增加了客户的学习成本，还可能让客户对产品产生畏难情绪。我建议瓴羊应当保留产品的核心简洁性，将复杂的数据管理和分析方法论通过服务来提供，而非在产品中堆砌过多的功能。只有这样，才能让用户更快上手，并真正发挥出产品的价值。

#### 三、打造品牌：服务是品牌的核心

随着市场竞争的加剧，客户对大数据服务的选择并不仅仅基于产品本身，而更多地考虑服务的质量和品牌。很多企业与瓴羊合作，是因为他们没有足够的团队或能力来实施复杂的数据解决方案。在这种情况下，客户往往难以评估哪家服务商更好，因此售后服务和品牌口碑就显得尤为重要。

瓴羊曾背靠阿里云，享有天然的品牌优势，但如今独立运营后，如何通过自身的服务来建立品牌信任变得至关重要。在我看来，过多的售前介绍和宣传反而会让客户对售后产生不确定性，只有通过持续的高质量售后服务，才能逐步积累口碑，进而提升品牌信任度。因此，瓴羊需要更多关注客户需求，通过真正理解和满足客户需求，打造出服务驱动的品牌形象。

#### 四、标准化成本控制的挑战与对策

在过去的项目中，我们一直在探索如何通过经验的积累和内部分享，将服务标准化、结构化，以实现更好地控制成本。然而，我逐渐意识到，服务的标准化实际上是一个很难完全实现的目标，特别是在复杂的大数据项目中，每个客户的需求和情况千差万别。

尽管瓴羊通过与大量ISV（独立软件供应商）合作，成功地降低了部分服务成本，但同时也带来了新的挑战。ISV的服务质量难以控制，增加了沟通成本，反而在一定程度上削弱了品牌的积累效应。我认为，未来瓴羊在成本控制上可以采取更加灵活的策略，不仅仅依赖标准化，而是通过细致的服务分层和差异化策略，让客户根据自身的需求选择最合适的服务包，同时确保服务的质量和一致性。

#### 五、拥抱AI的未来：机遇与挑战

在当前的AI热潮中，瓴羊也不例外地加入了拥抱AI的行列。然而，随着AI热度的逐渐降温，瓴羊必须清醒地意识到，大数据服务的核心仍在于为客户提供有效的解决方案，而非单纯追随技术趋势。AI作为工具，可以辅助数据分析和决策，但企业不能因为追求短期的AI热点而忽略了自身在大数据领域的根基。

如果在AI风口下，企业忘记了自己的核心竞争力和定位，那么随着热潮的褪去，瓴羊将面临被竞争对手赶超的风险。因此，瓴羊在拥抱AI的过程中，必须时刻保持对产品和服务本质的清晰认识，避免盲目追逐短期热点，保持其在大数据领域的核心优势。

#### 结论

瓴羊未来的发展必须在以下三个方面齐头并进：**打磨核心产品**、**打造服务驱动的品牌**、**灵活应对成本控制挑战**。在这三个基础上，企业才能在竞争激烈的大数据市场中立于不败之地。如果能同时保持对AI的理性拥抱，瓴羊将有机会在未来的市场中实现更长远的成功。</content:encoded></item><item><title>关于中文输入方式的问题——我现在是如何打字的</title><link>https://blog.rockythink.work/blog/关于中文输入方式的问题-我现在是如何打字的</link><guid isPermaLink="true">https://blog.rockythink.work/blog/关于中文输入方式的问题-我现在是如何打字的</guid><description>作为一名从事数据行业多年的人，我相信现在所有的云输入法，如搜狗、百度、QQ等，他们都一定会收集你的输入信息，这点我深信不疑，所以在前几年我为了保护下自己隐私，同时也改一改我的“二指禅”的毛病，决定研究下更高效安全的文字输入问题。</description><pubDate>Sat, 15 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&gt; 作为一名从事数据行业多年的人，我相信现在所有的云输入法，如搜狗、百度、QQ等，他们都一定会收集你的输入信息，这点我深信不疑，所以在前几年我为了保护下自己隐私，同时也改一改我的“二指禅”的毛病，决定研究下更高效安全的文字输入问题。

如上文所述，我非常建议大家谨慎对待任何会涉及到隐私的国内软件，这里不局限于输入法，我知道基于目前我们所处的环境，想抛弃所有的国产软件是不可能的，如同使用微信一样，我相信腾讯是有手段查看任何一个人的聊天记录的，这点我觉得没人可以反驳，其实很多人对隐私的理解是片面的，他们认为隐私是不愿和别人分享的信息，其实是不管你愿不愿意，隐私就是隐私，给你看是我权利，不给你看也是我的权利。我知道他们不屑看我的任何东西，但我也知道想看他们随时可以看，这点我就已经无法接受了。

啰嗦了，最后一点，你每次撬动键盘的行为，对任何一个资本家或者有心之人来说都是充满诱惑的，因为通过他可以非常准确的”认识“你，这也是大数据应用的一部分，这里不是重点，还有就是我其实对国内的舆论环境抱有担忧的，难听点，水军太多，跟风的人也太多，思考的人太少，为什么要扯到舆论呢：如果未来有一天，像是搜狗、这样的大输入法出现数据泄漏的事件，我相信我们甚至都看不见。他们会不遗余力的控制舆论，删帖洗白，这几年国外出了不少数据安全事故，都闹的很大，国内却寥寥无几，难道是国内的软件公司的安全技术都甩国外几条街吗？？？这点我是不相信的，要么已经发生，但被“公关”了，要么国内用户因为不在意，根本就不知道。


### 上面废话太多了

我几年前，一直都有“二指禅”的毛病，就是使用键盘的时候，大多数情况只用三四根手指，虽然这么多年也已经轻车熟路了，根本不影响我的打字速度，但毕竟上限太低，我需要两个手不停的在键盘上移动。

我先在[typingclub](https://www.typingclub.com/)上练习了指法，这个我认为是我最痛苦的时候，因为键盘的按键行为早已成为了肌肉记忆，想要改变真的是好难，那段时间手指头都要拧成麻花了，为了尽快适应，最简单的字，哪怕再着急要回复的消息，我都是按照标准的键盘指法来的，这里还有几个痛苦的故事。

等我基本上可以用正常的指法打字的时候，我就开始寻找效率更高的输入方案了，本来我是只知道拼音和五笔两种中文输入方案的，但等我看到之后，没想到有这么多的中文输入方案可以选择，其中我最终选择了小鹤双拼
原因有两个：

1. 小鹤双拼是有[官网](https://flypy.com/)的，而且也比较流行，网上相关的经验很多;
2. 学习成本相对较低，这个其实所有的双拼学习成本我都觉得不高，因为他就是拼音，只是让我们少打几个键而已;

自然，所有的主流输入软件，包括系统自带的输入法都支持不同的双拼方案，选择双拼之后，练习一段时间，就会发现自己的输入速度明显快了。

这里插一个关于提高输入效率的几个关键指标

1. 击键速度：也就是你可以一秒中击键几次，这个很好理解；
2. 键准：也就是你按键的准确率，也很好理解；
3. 码长：这个是指平均你每个汉字按键几次；

所以你打字的速度（字/分钟）不严谨的等于 = 击键速度 * 键准 / 码长 * 60秒

双拼其实对这三个方面都有所优势：

1. 双拼之所以是双拼，是任何一个汉字，都可以使用两个键来表示，比如《双》这个字，用拼音就是`shuang`，需要打六个字母，那么双拼只要两个，拿小鹤双拼来说，就是`ul`，这里`u`就是`sh`，`l`就是`uang`。
那么每个字都是两个字母，输入者会渐渐找到一种节奏，就像不变的节拍一样，我认为这点会提高击键速度，当然码长的问题也不不用说，6比2已经说明问题了。
2. 键准，按键次数少了，自然出错的机会也少了，键准也会高起来。

**但是有一点，很多输入法有自动纠错的功能，这样双拼的容错率比较低，还是拿《双》举例子，如果是全拼`shuang`，你打成了`shiang`或者别的什么，我相信基本上输入法会知道你输入错了，自动给你改回来，但对于双拼来说，他对应的就会是另外一个读音，自动纠错不会在这里起到任何作用，因为他判断不了你是不是错了**

### 重码率问题

中文的多音字非常多，如果使用基于拼音的输入方案都会有这个问题，不同的字或词有相同的拼音，所以我们每次打一个不怎么常用的字的时候，都要在候选框中选择，这个字在前面几个还好，如果在后面，眼睛都要瞎了，这不仅会影响到输入的效率，每每打一个生僻字后，我都已经忘了我这句话要说什么了，这个就不好了。

五笔的重码率就不高，但奈何他的学习成本太高，我是在是没有勇气学。

双拼只能解决码长问题，但对重码问题还是没有任何变化

所以拼音如何解决重码的问题的呢？

——**辅助码（辅码）**

辅码，是用来选字或词的，我们在拼音的后面加上一些输入，来筛选候选栏中的字，这个比较好理解。

但全拼无法使用直接辅码，因为程序不知道你输入的是拼音部分还是辅码部分，所以只能用一个键来告诉他，我接下来要输入辅码啦，比方说有些输入法用`tab`键来做为辅码的前置键，但使用起来，凭想像就知道一定是一言难尽的。

我们想要的是让程序自己判断我输入的是拼音还是辅码，这个双拼可以做到

因为双拼一个字的拼音击键只有两次，后面就一定是辅码

还拿《双》来举例
![20240615025806](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240615025806.png)
上图是我加入了辅码提示的候选框，我想要《双》我直接在`ul`的后面打`yy`就好，如果我想要《霜》后面加`yx`就好
我用的是自然码的辅码，其实很好理解，`yy`代表`又又`，`yx`代表`雨相`，为这个字部首的声母，很好理解吧

辅码一般为两个按键，所以你打一个字绝大多数情况下，最多只要打4个字母（两个双拼的拼音，两个辅码），这个字就会出现在你的首选项中，哪怕不再也基本上在前三，其实也是可以很方便的一个按键直接上屏的，`;`和`&apos;`，在你右手小拇指上，分别对应次选和次次选，不同的输入法有所区别，但大致如此，比使用键盘上的数字要方便很多，而且不容易按错。

不同的辅码方案有不同的方式，有的是用笔画的，有的是用拆字的，有的用部首，各种各样，这个大家可以自己去感受，我认为大家选大部分人用的就好，可能不是最好的方案，但一定不会差。

使用辅码可以大大降低重码率，这样，

### 软件问题

#### 云输入法

如果是云输入法，你可以找到不同输入方案的码表，这个表其实就是按键和不同字之间的配合，如`ul`就是`双` `爽` `霜` `艭`等，一般都有几万甚至十几万个对应关系，下载下来，输入法有导入功能导入就好。

#### RIME

你也可以选择开源的输入法，RIME，有时间我单独写一个RIME的分享，这个输入法，在mac中叫鼠须管（名称取自欧阳澥：“鼠须管，为物虽微情不浅，新诗醉墨时一挥，别后寄我无辞远。”），在windows中叫小狼毫，在Linux中叫中州韵，我也不明白为什么要不同的名字，不过他的使用门槛有一点，几乎没有配置界面，需要通过修改配置文件来配置输入法，官文也写的一般，是台湾同胞开发的，但好在是开源的，我们可以试一试别的第三方基于RIME的的输入法，官网和github上都能找到。

#### 我的方案

我使用了RIME + 小鹤音形使用了两年的时间，但后来我RIME的配置文件给我弄丢了，而且我总是忍不住更新新的词库，最后搞的很不习惯，换成苹果自带的双拼没有辅码的方式，使用一段时间还是不行，选字太麻烦了，后面选择了落格

**落格**

我很早就听说过落格输入法了，但由于收费所以迟迟未使用，国内个人开发的，定制化还是比较强的，门槛没那么高，而且也很方便。可以选择各种方案，以及不同方案之间的组合。

这段时间，我想试一试，目前还可以，而且mac的收费也不是很高，88永久，奢侈一点一天的饭钱可能都不够，最主要的是个人开发者，我愿意付费也有一些原因是感情支持一下，至少在我知道他开始到现在已经有好几年了，不容易，对于国内的个人开发者来说，能坚持下来不同意。

不过IOS我就没太多兴趣了，我手机基本上都只是用来搜索或者发消息的，长文基本不会用手机，之前用过iRime,仓输入法等，都是Rime的三方软件，都挺好用的，后面觉得手机懒得折腾，现在用的是自带的小鹤双拼，够用，对输入准确性或者速度啥的要求不高，原来也想买一个IOS的落格来用的，但我觉得收费不合理，订阅制，一年也要一两百了，为了一个输入法持续花钱，而且替代的方案那么多，我觉得不值。


大概就是这样吧，好累，不知不觉又快四点了。

晚安，See you!</content:encoded></item><item><title>Hive表中数据倾斜的处理方法</title><link>https://blog.rockythink.work/blog/hive表中数据倾斜的处理方法</link><guid isPermaLink="true">https://blog.rockythink.work/blog/hive表中数据倾斜的处理方法</guid><description>在 Hive 表中，数据倾斜 是大数据处理中的常见问题，尤其在执行 JOIN、GROUP BY、DISTINCT 等操作时，某些键值的数据分布不均匀，导致某些计算节点负载过重，任务执行变慢甚至失败。以下是处理 Hive 表数据倾斜的常见方法：</description><pubDate>Mon, 23 Sep 2024 00:00:00 GMT</pubDate><content:encoded>在 Hive 表中，**数据倾斜** 是大数据处理中的常见问题，尤其在执行 **JOIN**、**GROUP BY**、**DISTINCT** 等操作时，某些键值的数据分布不均匀，导致某些计算节点负载过重，任务执行变慢甚至失败。以下是处理 Hive 表数据倾斜的常见方法：

### 1. **调整 MapReduce 参数**
Hive 基于 Hadoop MapReduce 进行任务调度，优化 MapReduce 参数能够有效减少数据倾斜问题。

#### 1.1 增加 MapReduce 的并行度
通过增加 Reduce 任务的数量，可以在一定程度上分摊负载过重的问题。

```sql
set mapreduce.job.reduces=20;
```

`mapreduce.job.reduces` 参数用于控制 Reduce 任务的数量。根据数据量、节点配置进行适当调整。如果数据倾斜较严重，增大 Reduce 的数量可以分摊数据负载。

#### 1.2 开启 Hive 自动推断 Reduce 数量
Hive 提供了自动推断合适的 Reduce 数量功能，可以根据输入数据的大小自动调整。

```sql
set hive.exec.reducers.bytes.per.reducer=67108864;  -- 64 MB per reducer
set hive.exec.reducers.max=1009;  -- 最大Reducer数量
```

`hive.exec.reducers.bytes.per.reducer` 参数定义了每个 Reduce 任务的处理数据量上限。通过调小这个参数，Hive 将为数据倾斜的场景分配更多的 Reduce 任务。

---

### 2. **在 JOIN 操作中使用 `mapjoin`**
`mapjoin`（又称广播 Join）是将较小的表加载到每个 Map 任务的内存中，避免 Reduce 任务，从而减少数据倾斜的风险。适用于一张表很小、可以被完全加载到内存中的情况。

```sql
set hive.auto.convert.join=true;  -- 启用自动mapjoin
```

或者显式指定使用 `mapjoin`：

```sql
SELECT /*+ MAPJOIN(small_table) */ *
FROM large_table l
JOIN small_table s
ON l.id = s.id;
```

Hive 会将 `small_table` 以广播的形式分发到所有 Mapper 中，从而避免 Reduce 任务。

---

### 3. **使用 `skewjoin` 解决 JOIN 时的数据倾斜**
Hive 提供了 `skewjoin` 功能，专门用来处理 Join 时的键值数据倾斜问题。其原理是：如果某些键值的数据量过大，Hive 会将这部分数据拆分成多个 Map 任务分开处理。

```sql
set hive.optimize.skewjoin=true;
```

工作机制：
- 首先，Hive 进行局部的 Join 处理，将大部分没有数据倾斜的键值处理掉。
- 对于倾斜的键值，Hive 将其分配给多个 Reducer 处理，以均摊负载。

---

### 4. **在 GROUP BY 操作中使用 `hive.groupby.skewindata`**
对于 **GROUP BY** 操作中的数据倾斜，Hive 提供了 `hive.groupby.skewindata` 参数来处理。其处理原理是：首先进行一次局部聚合，减少数据量，然后再进行全局聚合。

```sql
set hive.groupby.skewindata=true;
```

工作机制：
- Hive 会将倾斜的键值数据分配到多个 Reducer 来处理，避免某些 Reducer 负载过重。
- 经过初步处理后，再次聚合以获得最终的结果。

---

### 5. **使用 `SALIENCE` 或自定义 Hash 函数**
如果某些键值在数据分布上严重倾斜，可以在分区时引入随机性或自定义 Hash 函数，打散倾斜的数据。

#### 5.1 使用随机数打散数据
可以通过添加随机数或哈希值来分散倾斜数据。例如，可以在 Join 键或 Group By 键上附加一个随机数列，将其打散到不同的分区或 Reduce 任务中处理。

```sql
SELECT *
FROM large_table l
JOIN small_table s
ON concat(l.id, RAND()) = s.id;
```

这种方式将大大降低某些键值倾斜的概率。

#### 5.2 自定义 Hash 函数
对可能导致倾斜的字段使用自定义的 Hash 函数，重新分布数据。例如，可以对 Join 键进行哈希，然后再进行 Join 操作：

```sql
SELECT *
FROM large_table l
JOIN small_table s
ON hash(l.id) = s.id;
```

---

### 6. **对数据进行预聚合**
在处理大规模的 Group By 操作时，可以先通过子查询进行数据的预聚合，减少最终参与全局聚合的数据量。

```sql
SELECT city, COUNT(*)
FROM (
    SELECT city, product, COUNT(*) as cnt
    FROM sales_data
    GROUP BY city, product
) tmp
GROUP BY city;
```

这种方法通过先在子查询中聚合，将数据量减少，再进行最终的全局聚合，减轻数据倾斜带来的负载。

---

### 7. **对倾斜的键进行单独处理**
当你明确知道哪些键值导致了数据倾斜时，可以将这些键单独处理，避免影响其他键值的数据处理。

```sql
-- 处理倾斜的 key (如 &quot;special_key&quot;)
SELECT *
FROM large_table l
JOIN small_table s
ON l.id = s.id
WHERE l.id = &apos;special_key&apos;;

-- 处理非倾斜的数据
SELECT *
FROM large_table l
JOIN small_table s
ON l.id = s.id
WHERE l.id != &apos;special_key&apos;;
```

将倾斜的数据拆分成多个部分单独处理，降低整体的负载。

---

### 8. **使用 Partition 或 Bucket 优化数据分布**
通过分区（Partition）或桶（Bucket）来重新组织数据，确保每个分区或桶中的数据分布均匀，从而避免数据倾斜。

#### 8.1 使用 Partition 分区
在创建 Hive 表时，按照某个列进行分区，将数据分散到不同的分区中处理。例如，可以按 `date` 列进行分区：

```sql
CREATE TABLE partitioned_table (
  id STRING,
  product STRING,
  sales BIGINT
) PARTITIONED BY (date STRING);
```

#### 8.2 使用 Bucket 进行桶化
通过对某列进行桶化（Bucket），可以将数据分配到多个 Bucket 中，从而减少数据倾斜。

```sql
CREATE TABLE bucketed_table (
  id STRING,
  product STRING,
  sales BIGINT
) CLUSTERED BY (id) INTO 10 BUCKETS;
```

通过桶化，数据可以按键均匀分布在不同的 Bucket 中，降低数据倾斜的风险。

---

### 结论

在 Hive 中处理数据倾斜问题需要结合业务场景和数据特征，使用合适的优化策略。常见的处理方式包括调整 MapReduce 参数、使用 `mapjoin` 或 `skewjoin`、数据打散、预聚合和使用分区或桶优化数据分布等。这些方法可以有效减少数据倾斜带来的性能问题，提升 Hive 查询的效率。</content:encoded></item><item><title>【离线数仓】拉链表的3种构建方案</title><link>https://blog.rockythink.work/blog/离线数仓拉链表的常规构建</link><guid isPermaLink="true">https://blog.rockythink.work/blog/离线数仓拉链表的常规构建</guid><description>前面说到了拉链表的应用场景，但在我们构建拉链表的时候，往往是从快照表中构建数据的，我接下来会基于介绍3种经验方案，用来提供给大家更多的参考。</description><pubDate>Wed, 25 Sep 2024 00:00:00 GMT</pubDate><content:encoded>在阐述具体的3个方案之前，我先总结下3个方案的优缺点：

### 方案一：

**优点**：思路简洁，易于维护。

**缺点**：初始化时会丢失历史数据的变化，维护成本较高。

---

### 方案二：

**优点**：思路简洁，易于维护，初始化时不会丢失历史数据的变化。

**缺点**：初始化周期较长，若历史数据量大，会耗费大量时间成本，同时维护成本较高。

---

### 方案三：

**优点**：不会丢失历史数据变化，且接近免维护。

**缺点**：资源占用较多，若历史数据量大，会带来较高的计算资源成本。


## 方案一：不考虑历史变化的情况

如果所有的表都是 **分区表**，在将 **快照表** 转换为 **拉链表** 时，我们可以充分利用分区特性，优化查询性能并提高更新效率。分区表通过将数据按照某个字段进行逻辑分割，减少了每次查询时的数据扫描量，非常适合处理大规模数据。本文中，我们将展示如何基于分区表来完成这个转换过程。

### 场景描述

假设我们有一张按日期分区的 **快照表** `snapshot_table`，其分区字段是 `date`，记录着每天的用户信息快照。该表的结构如下：

```sql
CREATE TABLE snapshot_table (
    id STRING,
    name STRING,
    email STRING,
    update_time TIMESTAMP
) PARTITIONED BY (date STRING)  -- 按日期分区
STORED AS ORC;
```

### 目标：将 `snapshot_table` 转换为拉链表 `dim_user_scd`

拉链表 `dim_user_scd` 将跟踪每个用户数据的历史变化，并且也是分区表，按照 `start_date` 进行分区，以优化查询和更新性能。拉链表的结构如下：

```sql
CREATE TABLE dim_user_scd (
    id STRING,
    name STRING,
    email STRING,
    start_date STRING,
    end_date STRING
) PARTITIONED BY (start_date STRING)  -- 按开始日期分区
STORED AS ORC;
```

### 实现步骤

#### 1. 初始化拉链表（首次加载）

在初次创建拉链表时，我们需要将最新的快照数据插入到拉链表中。为了确保插入的数据记录当前有效，设置每条记录的 `end_date` 为 `&apos;9999-12-31&apos;`。

假设我们的快照表从 2024-09-20 开始，我们可以从该日期的分区中加载数据到拉链表：

```sql
-- 假设快照表的日期是2024-09-20
INSERT INTO dim_user_scd PARTITION (start_date=&apos;2024-09-20&apos;)
SELECT
    id,
    name,
    email,
    &apos;2024-09-20&apos; AS start_date,
    &apos;9999-12-31&apos; AS end_date
FROM snapshot_table
WHERE date = &apos;2024-09-20&apos;;
```

这一步将快照表的最新数据导入拉链表，并将其设置为当前有效。

---

#### 2. 增量更新拉链表

随着每天快照表的更新，我们需要增量更新拉链表，确保数据的历史变化被记录。为了实现增量更新，我们可以依赖两个步骤：
- **更新历史记录的结束日期**：对于那些发生变化的记录，需要将之前有效的记录标记为失效（更新 `end_date`）。
- **插入新的记录**：对于新增或变化的记录，需要插入新的记录，表示该记录的最新状态。

##### 2.1 更新已存在但发生变化的记录

首先，我们更新拉链表中已经存在但发生变化的记录，将其 `end_date` 更新为当前日期，表示这些记录不再有效。

```sql
WITH snapshot AS (
    SELECT
        id,
        name,
        email
    FROM snapshot_table
    WHERE date = &apos;2024-09-21&apos;  -- 假设这是增量数据
),

scd_active AS (
    SELECT
        id,
        name,
        email,
        start_date,
        end_date
    FROM dim_user_scd
    WHERE end_date = &apos;9999-12-31&apos;  -- 当前有效的记录
)

-- 更新已存在但数据变化的记录
INSERT INTO dim_user_scd PARTITION (start_date)
SELECT
    scd.id,
    scd.name,
    scd.email,
    scd.start_date,
    &apos;2024-09-21&apos; AS end_date  -- 结束日期更新为当前日期
FROM scd_active scd
JOIN snapshot sn
ON scd.id = sn.id
WHERE (scd.name != sn.name OR scd.email != sn.email);
```

这一步会将当前有效的数据（`end_date = &apos;9999-12-31&apos;`）中发生变化的记录，更新为无效（将 `end_date` 更新为当前日期）。

##### 2.2 插入新增或变化后的新记录

接下来，插入新的或更新后的记录，这些记录表示最新的用户信息，并且设置新的 `start_date` 和 `end_date`。

```sql
-- 插入新的或变化后的记录
INSERT INTO dim_user_scd PARTITION (start_date=&apos;2024-09-21&apos;)
SELECT
    sn.id,
    sn.name,
    sn.email,
    &apos;2024-09-21&apos; AS start_date,   -- 当前日期作为生效日期
    &apos;9999-12-31&apos; AS end_date      -- end_date 设置为未来日期，表示当前有效
FROM snapshot sn
LEFT JOIN scd_active scd
ON sn.id = scd.id
WHERE scd.id IS NULL              -- 新增的记录
   OR (scd.name != sn.name OR scd.email != sn.email);  -- 发生变化的记录
```

这一步将处理发生变化的记录或新增的记录，将其插入到拉链表中，并设置其 `start_date` 为当前日期，`end_date` 为 `&apos;9999-12-31&apos;`。

---

#### 3. 分区优化

**分区表**可以极大提高数据查询和更新的效率，因此我们可以考虑使用以下策略来进一步优化：
- **分区修剪**：由于拉链表是按 `start_date` 分区的，Hive 在查询或更新时会自动使用分区修剪技术，减少扫描的数据量。只要查询时指定分区条件，Hive 只会扫描相关分区的数据。
- **动态分区插入**：Hive 支持动态分区插入，可以在插入新记录时根据 `start_date` 自动创建分区，这样可以避免手动创建分区的麻烦。

```sql
-- 启用动态分区插入
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;

-- 使用动态分区插入更新后的记录
INSERT INTO dim_user_scd PARTITION (start_date)
SELECT
    sn.id,
    sn.name,
    sn.email,
    &apos;2024-09-21&apos; AS start_date,  -- 根据增量数据的日期动态创建分区
    &apos;9999-12-31&apos; AS end_date
FROM snapshot sn;
```

通过启用动态分区，Hive 会自动为新的 `start_date` 创建对应的分区，避免手动维护分区。

---

### 4. 示例执行流程

假设快照表 `snapshot_table` 每天更新一次，并且每天的增量数据会被插入到拉链表中。

#### 4.1 首次加载

快照表 `2024-09-20` 的数据：

```sql
-- 快照表 2024-09-20 的数据
id      | name       | email               | date
---------------------------------------------------
1       | Alice      | alice@gmail.com      | 2024-09-20
2       | Bob        | bob@gmail.com        | 2024-09-20
3       | Carol      | carol@gmail.com      | 2024-09-20
```

首次加载后，拉链表 `dim_user_scd` 的数据：

```sql
-- 拉链表 dim_user_scd（2024-09-20 初始加载）
id      | name       | email               | start_date   | end_date
---------------------------------------------------------------------
1       | Alice      | alice@gmail.com      | 2024-09-20   | 9999-12-31
2       | Bob        | bob@gmail.com        | 2024-09-20   | 9999-12-31
3       | Carol      | carol@gmail.com      | 2024-09-20   | 9999-12-31
```

#### 4.2 第二天增量更新

快照表 `2024-09-21` 的数据：

```sql
-- 快照表 2024-09-21 的数据
id      | name       | email               | date
---------------------------------------------------
1       | Alice      | alice_new@gmail.com  | 2024-09-21  -- Alice 的 email 发生变化
2       | Bob        | bob@gmail.com        | 2024-09-21  -- 无变化
4       | David      | david@gmail.com      | 2024-09-21  -- 新增用户
```

增量更新后，拉链表 `dim_user_scd` 的数据：

```sql
-- 拉链表 dim_user_scd（更新后）
id      | name       | email               | start_date   | end_date
---------------------------------------------------------------------
1       | Alice      | alice@gmail.com      | 2024-09-20   | 2024-09-21  -- 原始记录失效
1       | Alice      | alice_new@gmail.com  | 2024-09-21   | 9999-12-31  -- 新记录生效
2       | Bob        | bob@gmail.com        | 2024-09-20   | 9999-12
```

**这个方案的缺点在于历史数据的变化会丢失，也就是我们在做初始化的时候，拉链表的数据只有一种情况，那就是全部的`end_date`都是`9999-12-31`，第二天（2024-09-25）数据更新后，也只会出现`end_date` = `2024-09-25`的情况，如果快照表分区的开始时间是`2023-09-25`，那么过去一年的历史变化都不会在拉链表中体现；**

## 方案二：初始化时候考虑数据的历史变化

### 问题描述

基于方案一：在将快照表转换为拉链表时，如果直接从快照表的最新分区加载数据，我们只会捕获当前的数据状态，而忽略过去的变化记录。为了正确构建拉链表，我们需要**遍历快照表中的所有分区**，按日期顺序依次处理每个分区的数据，记录每一天的变化。

### 解决方案

我们需要对快照表的所有分区进行遍历处理，将每个分区的数据按时间顺序加载到拉链表中，并在插入新的变化记录时适当地更新历史记录的结束时间。

### 实现步骤

#### 1. 初始化拉链表

首先，创建一个空的拉链表 `dim_user_scd`，并设置 `start_date` 和 `end_date` 来记录每条记录的生效和失效日期。

```sql
CREATE TABLE IF NOT EXISTS dim_user_scd (
    id STRING,
    name STRING,
    email STRING,
    start_date STRING,
    end_date STRING
) PARTITIONED BY (start_date STRING)  -- 按开始日期分区
STORED AS ORC;
```

#### 2. 按日期顺序处理快照表分区

为了保留历史变化记录，我们需要按顺序处理快照表的每个分区，并将变化记录插入拉链表中。首先，获取快照表的所有分区，然后依次处理每个分区的数据。

```sql
-- 获取快照表的所有分区
SHOW PARTITIONS snapshot_table;
```

假设返回的分区是：

```plaintext
date=2024-09-20
date=2024-09-21
date=2024-09-22
```

我们需要按日期顺序处理每个分区的记录。

#### 3. 处理每个分区的数据

对于每个分区，我们需要进行以下几步操作：
- **找到该分区的数据**：从快照表中获取该日期的快照数据。
- **更新拉链表中已有记录的结束时间**：对于那些数据发生变化的记录，将其标记为失效。
- **插入新的或变化的记录**：对于新增或变化的记录，将其插入拉链表，并标记为当前有效。

##### 3.1 更新已有记录的结束时间

对于每个分区，首先查找那些在拉链表中已经存在但数据发生变化的记录，并将其 `end_date` 更新为当前分区的日期，表示这些记录不再有效。

```sql
WITH snapshot AS (
    SELECT
        id,
        name,
        email
    FROM snapshot_table
    WHERE date = &apos;2024-09-21&apos;  -- 当前处理的分区
),

scd_active AS (
    SELECT
        id,
        name,
        email,
        start_date,
        end_date
    FROM dim_user_scd
    WHERE end_date = &apos;9999-12-31&apos;  -- 查找当前有效的记录
)

-- 更新拉链表中已经存在但数据发生变化的记录
INSERT INTO dim_user_scd PARTITION (start_date)
SELECT
    scd.id,
    scd.name,
    scd.email,
    scd.start_date,
    &apos;2024-09-21&apos; AS end_date  -- 当前分区的日期为结束日期
FROM scd_active scd
JOIN snapshot sn
ON scd.id = sn.id
WHERE (scd.name != sn.name OR scd.email != sn.email);
```

##### 3.2 插入新的或变化的记录

接下来，我们插入那些在当前分区内新增的或发生变化的记录，将其 `start_date` 设置为当前分区的日期，表示这些记录自该日期开始生效。

```sql
-- 插入新的或变化的记录
INSERT INTO dim_user_scd PARTITION (start_date=&apos;2024-09-21&apos;)
SELECT
    sn.id,
    sn.name,
    sn.email,
    &apos;2024-09-21&apos; AS start_date,   -- 当前分区的日期为生效日期
    &apos;9999-12-31&apos; AS end_date      -- 设置 end_date 为未来日期，表示当前有效
FROM snapshot sn
LEFT JOIN scd_active scd
ON sn.id = scd.id
WHERE scd.id IS NULL              -- 新增的记录
   OR (scd.name != sn.name OR scd.email != sn.email);  -- 发生变化的记录
```

### 4. 动态处理所有分区

为了自动化地处理每个分区，可以通过编写一个 Hive 脚本，依次处理每个日期的分区。伪代码如下：

```bash
for partition in $(hive -e &quot;SHOW PARTITIONS snapshot_table;&quot;)
do
    # 提取日期
    date=$(echo $partition | cut -d&apos;=&apos; -f2)

    # 执行更新和插入操作
    hive -e &quot;
    -- 更新历史记录的 end_date
    WITH snapshot AS (
        SELECT id, name, email FROM snapshot_table WHERE date = &apos;$date&apos;
    ),
    scd_active AS (
        SELECT id, name, email, start_date, end_date FROM dim_user_scd WHERE end_date = &apos;9999-12-31&apos;
    )
    INSERT INTO dim_user_scd PARTITION (start_date)
    SELECT scd.id, scd.name, scd.email, scd.start_date, &apos;$date&apos; AS end_date
    FROM scd_active scd
    JOIN snapshot sn ON scd.id = sn.id
    WHERE (scd.name != sn.name OR scd.email != sn.email);

    -- 插入新的或变化的记录
    INSERT INTO dim_user_scd PARTITION (start_date=&apos;$date&apos;)
    SELECT sn.id, sn.name, sn.email, &apos;$date&apos; AS start_date, &apos;9999-12-31&apos; AS end_date
    FROM snapshot sn
    LEFT JOIN scd_active scd ON sn.id = scd.id
    WHERE scd.id IS NULL OR (scd.name != sn.name OR scd.email != sn.email);
    &quot;
done
```

通过此循环脚本，依次处理每个分区，并确保每一天的数据变化都会被记录到拉链表中。

---

### 5. 总结

通过上述改进后的方案，我们能够完整保留快照表从开始日期到当前日期的所有数据变化，并正确地将其转换为拉链表。具体步骤如下：
1. **按日期顺序处理快照表的所有分区**：确保每个分区的数据都会被处理，不会遗漏历史变化。
2. **更新已有记录的结束时间**：对于那些已经存在的记录，如果数据发生了变化，将其 `end_date` 设置为变化发生的日期。
3. **插入新的或变化的记录**：对于新增或更新后的记录，将其插入拉链表，并标记为当前有效。

这样，拉链表将保留所有数据变化的历史，并能够通过分区表优化查询性能。

但这么做也有缺点：1、初始化会耗费很长时间，因为在遍历的过程中，整个执行过程是单进程的，无法并行处理，所以会耗费相当的时间；2、在实际应用中，如果出现过去某个分区数据异常，或者快照表中某个分区异常，那么初始化动作将会重做，维护成本相当高；

## 方案三：保留历史数据，数据趋于免维护

**这个方案是我在过去的某个项目中自创的，我认为是目前最好的方案，思路是在尽可能节约执行时间的前提下，每天初始化一遍，抛砖引玉，希望提供给大家参考。**

该方案的目标是通过每日调度快照表数据，构建一张能够跟踪数据变化的拉链表，记录每条数据的有效时间段（`start_date` 到 `end_date`）。此方案采用全分区扫描，使用窗口函数对比相邻分区数据，避免存储重复数据，并为每条记录生成准确的生效和失效时间。

### **表结构**

1. **快照表 (`snapshot_table`)**：
   - `name`：用户名称
   - `email`：用户电子邮件
   - `date`：日期（分区字段）

2. **拉链表 (`dim_user_scd`)**：
   - `name`：用户名称
   - `email`：用户电子邮件
   - `start_date`：数据生效日期
   - `end_date`：数据失效日期

### **方案流程**

#### **步骤 1：获取快照表所有分区数据**
每天从快照表获取所有按 `date` 分区的数据，通常通过调度系统触发。

```sql
-- 获取快照表的所有分区
SHOW PARTITIONS snapshot_table;
```

#### **步骤 2：对比相邻分区数据，剔除重复的记录**

1. **窗口函数 `LAG` 和 `MAX` 的使用**：
   - 对每个 `name` 的数据按 `date` 升序排列。
   - 使用 `LAG(email)` 来获取上一行的 `email` 以对比变化。
   - 使用 `MAX(date)` 获取同一 `name` 的最大 `date`。

2. **剔除无变化的数据**：
   - 如果 `email` 没有发生变化，则不再保留这条记录。
   - 保留有变化的数据，包括上一行的 `email` 和 `date` 作为 `prev_email` 和 `prev_date`。

```sql
WITH ordered_data AS (
    SELECT 
        name,
        email,
        date, 
        LAG(email) OVER (PARTITION BY name ORDER BY date) AS prev_email,  -- 获取上一行的 email
        LAG(date) OVER (PARTITION BY name ORDER BY date) AS prev_date,    -- 获取上一行的 date
        MAX(date) OVER (PARTITION BY name ORDER BY date) AS max_date      -- 获取同一 name 的最大 date
    FROM snapshot_table
),

filtered_data AS (
    SELECT 
        name,
        email,
        date,
        prev_email,
        prev_date,
        max_date
    FROM ordered_data
    WHERE prev_email IS NULL OR email != prev_email  -- 如果 email 不相同，保留该行数据
);
```

**解释**：
- `LAG(email)`：获取上一行 `email`，用于当前行的比较。
- `prev_email` 和 `prev_date`：分别存储上一行的 `email` 和 `date`，用于后续对比和计算。

---

#### **步骤 3：计算 `start_date` 和 `end_date`**

1. **窗口函数 `LEAD(prev_date)` 生成 `next_date`**：
   - 使用 `LEAD(prev_date)` 获取下一行的 `prev_date` 作为当前行的 `end_date`。
   - 如果没有下一行数据，则通过 `max_date` 确定 `end_date`：
     - 如果 `max_date` 是当前日期，`end_date` 设为 `&apos;9999-12-31&apos;` 表示当前数据仍然有效。
     - 否则，将 `end_date` 设为 `max_date`，表示历史数据的失效时间。

```sql
WITH final_data AS (
    SELECT 
        name,
        email,
        date AS start_date,
        LEAD(prev_date) OVER (PARTITION BY name ORDER BY date) AS next_date,  -- 获取下一行的 prev_date 作为 end_date
        max_date
    FROM filtered_data
),

scd_data AS (
    SELECT
        name,
        email,
        start_date,
        CASE 
            WHEN next_date IS NULL THEN  -- 如果没有下一行数据
                CASE 
                    WHEN max_date = current_date() THEN &apos;9999-12-31&apos;  -- 如果 max_date 是今天，赋值 &apos;9999-12-31&apos;
                    ELSE max_date  -- 否则赋值为 max_date
                END
            ELSE next_date  -- 有下一行时，赋值为 next_date
        END AS end_date
    FROM final_data
);
```

**解释**：
- `LEAD(prev_date)`：获取下一行的 `prev_date` 作为当前行的 `end_date`，确保上下记录的时间段对接。
- `CASE` 语句：处理 `next_date` 为空的情况，判断 `max_date` 是否是当前日期来动态设定 `end_date`。

---

#### **步骤 4：将结果插入到拉链表**

将经过处理的记录插入到拉链表 `dim_user_scd` 中，记录每条数据的 `start_date` 和 `end_date`。

```sql
-- 插入结果到拉链表
INSERT INTO dim_user_scd
SELECT 
    name,
    email,
    start_date,
    end_date
FROM scd_data;
```

**解释**：
- 将 `scd_data` 中生成的有效时间段插入到拉链表中，确保每条记录的生效和失效时间清晰明了。

---

### **完整 SQL 实现**

```sql
WITH ordered_data AS (
    SELECT 
        name,
        email,
        date, 
        LAG(email) OVER (PARTITION BY name ORDER BY date) AS prev_email,  -- 获取上一行的 email
        LAG(date) OVER (PARTITION BY name ORDER BY date) AS prev_date,    -- 获取上一行的 date
        MAX(date) OVER (PARTITION BY name ORDER BY date) AS max_date      -- 获取同一 name 的最大 date
    FROM snapshot_table
),

filtered_data AS (
    SELECT 
        name,
        email,
        date,
        prev_email,
        prev_date,
        max_date
    FROM ordered_data
    WHERE prev_email IS NULL OR email != prev_email  -- 如果 email 不相同，保留该行数据
),

final_data AS (
    SELECT 
        name,
        email,
        date AS start_date,
        LEAD(prev_date) OVER (PARTITION BY name ORDER BY date) AS next_date,  -- 获取下一行的 prev_date 作为 end_date
        max_date
    FROM filtered_data
),

scd_data AS (
    SELECT
        name,
        email,
        start_date,
        CASE 
            WHEN next_date IS NULL THEN  -- 如果没有下一行数据
                CASE 
                    WHEN max_date = current_date() THEN &apos;9999-12-31&apos;  -- 如果 max_date 是今天，赋值 &apos;9999-12-31&apos;
                    ELSE max_date  -- 否则赋值为 max_date
                END
            ELSE next_date  -- 有下一行时，赋值为 next_date
        END AS end_date
    FROM final_data
)

-- 插入结果到拉链表
INSERT INTO dim_user_scd
SELECT 
    name,
    email,
    start_date,
    end_date
FROM scd_data;
```

---

### **方案优点**

1. **历史数据保留**：该方案保证了拉链表中的每条记录都能准确地保留历史数据变化，避免了初始化时丢失数据的问题。
2. **动态调整有效时间**：通过 `LEAD(prev_date)` 和 `max_date` 的结合，拉链表能够动态生成每条记录的 `start_date` 和 `end_date`，适应了不同记录的生命周期管理。
3. **高效处理**：利用窗口函数和有条件的过滤逻辑，能够快速剔除无效的重复数据，避免冗余计算和存储。

---

### **总结**

这个拉链表的构建方案结合了窗口函数的强大功能，通过多次数据处理和时间逻辑的判断，确保每条记录的生效和失效时间清晰，能够准确跟踪数据变化。通过这种方法，可以有效实现历史数据的管理，并且减少了冗余数据的存储和维护工作。


## 好了，各位，以上是我的分享，大家根据自己的情况，希望对你们有用！</content:encoded></item><item><title>分享下我怎么玩的NAS</title><link>https://blog.rockythink.work/blog/分享下我怎么玩的nas软路由</link><guid isPermaLink="true">https://blog.rockythink.work/blog/分享下我怎么玩的nas软路由</guid><description>去年公司内购活动，花了3000块钱搞了个群晖的DS1821+，分享下我都用它做了什么。欢迎大家交流</description><pubDate>Fri, 19 Jul 2024 00:00:00 GMT</pubDate><content:encoded>## 背景故事

我其实在几年前就已经开始玩过一段时间的nas，不过当时只是因为自己的工作主力机器从Windows转为mac了，导致家里的台式机被闲置，物尽其用，所以就卖掉显卡，开始折腾NAS，从ESXi、PVE玩起来，最后直接黑群晖，后来又使用了TrueNAS，对着网上的文章和视频，一点一点学习。

但从使用的角度出发，我当时并没有真正在用，而是为了折腾而折腾，因为用的都是黑系统，硬件兼容等问题导致问题不断，然后又解决问题，等大神出来又有新的解决办法，开始重新折腾。总言而之吧，以玩为主，用基本上没怎么用。

后面孩子出生后，就完全不搞了。

直到去年，公司行政搞了个内购，卖点公司业务缩减后多于的产品，我一眼就看到了这台DS1821+，如果是让我自己选择NAS的话，我肯定不会选他，毕竟将近10000块的价格，但公司内购下的3000元是真的香啊，所以就买了下来。

![20240719155939](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240719155939.png)

用了一年后，所以想分享下使用经验；

## 硬件部分

1. **处理器**：
   - 型号：AMD Ryzen V1500B
   - 架构：四核心 2.2GHz

2. **内存**：
   - 标配：4GB DDR4 ECC SODIMM
   - 最大支持：32GB（16GB x 2）

3. **存储**：
   - 硬盘槽：8个 3.5&quot;/2.5&quot; SATA HDD/SSD
   - 最大内部净总存储容量：160 TB (20 TB drive x 8) (容量可能因RAID类型和使用的硬盘有所不同)

4. **网络**：
   - 网口：4 个 1GbE RJ-45 网口
   - 支持 Link Aggregation / Failover

上面是我拿到手之后的配置，后面觉得内存不太够，所以加了一块16G的ECC内存，淘宝买的，不是原装，不贵，但够用了。

### 硬盘

硬盘部分是我最纠结的部分，当前我的硬盘位也只使用了4个，而且每块硬盘都是4T的容量，这个肯定不算大，但对于家用来说，我感觉绰绰有余了。

NAS专用的硬盘实在是太贵了，所以我选择了希捷酷鹰4T：

![20240719160818](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240719160818.png)

分开买的，前面的两块是淘宝买的，后面的两块是拼多多买的

但实话实说，淘宝的两块温度要比拼多多要高一些，如下：

![20240719161120](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240719161120.png)

![20240719161141](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240719161141.png)

我也不知道是什么原因，好在这几块硬盘一直没有出过问题。

我是这么想的，因为是组raid，有一块硬盘容错，我觉得两块硬盘都出问题的概率比较低，一旦有一块出问题，就立马买个新的补上。

相比之下，300一块的ST4000性价比明显要更高一些。

**机械硬盘就是这样的，但作为缓存的SSD我的确有过两次事故**

### SSD缓存

群晖的缓存分两种，一种是读缓存，一种是读写缓存，简单理解就是，第一种只会把常用的一些文件缓存在ssd中，以加快访问速度，ssd中的文件都是从机械硬盘中来的，所以如果ssd挂了，你的数据</content:encoded></item><item><title>在大数据的内容创造上，我想以 build in public 的方式进行</title><link>https://blog.rockythink.work/blog/在大数据的内容创造上我想以-build-in-public-的方式进行</link><guid isPermaLink="true">https://blog.rockythink.work/blog/在大数据的内容创造上我想以-build-in-public-的方式进行</guid><description>我自从两周前开始做大数据相关的内容创作以来，我一直被各种问题困扰，很多问题其实在我做这个事情之前就已经考虑好的，但实际开始做的时候，我得到了一些新的反馈，重点是我看到了很多朋友们已经在做同样的事情，但他们好像都有一个终极的目标——**卖课**。**但但但，我也要走这样的路吗？**</description><pubDate>Tue, 25 Mar 2025 00:00:00 GMT</pubDate><content:encoded>我自从两周前开始做大数据相关的内容创作以来，我一直被各种问题困扰，很多问题其实在我做这个事情之前就已经考虑好的，但实际开始做的时候，我得到了一些新的反馈，重点是我看到了很多朋友们已经在做同样的事情，但他们好像都有一个终极的目标——**卖课**。

**但但但，我也要走这样的路吗？**

我觉得我并做不好这样的事情，因为我不认为课程会对一个人的成长有多大的影响，我肯定做不好一个我自己都不认可的事情。

我认为**大数据行业从业者的成长靠的只有是实践！！！**，技术是可以学来的，但经验是需要在项目中积累的。

&gt; 问题是大数据并不是java、python、更不是nodejs，靠自己在IDE中敲敲打打就可以让自己成长，大数据从业者的能力必须在解决问题的过程中积累！

这点我似乎很难帮上忙，所以我想到一个折中的办法——**写作**：

&gt; 有的时候你觉得你懂了，但在实践中却总是会忘记去使用它，因为**你只是记住了，不代表它是你的了**，你需要在“实践”中让它成为你的，我认为**写作也是一种实践**，因为写作会让你理清你的观点，通过写作你时常会发现其实你并没有真的懂，写作的意义就是在此，因为**你会被自己的不“精通”而卡文**，因为你无法准确梳理出来，在强迫自己写完（强迫自己梳理清楚）的**过程中，你会把这个知识变成自己的**，你可以很自信的说我懂得这个知识点，我深谙这个思想！


**所以，我想要采用 build in public 的方式来开展大数据从业者知识库的工作**。这种方式就像是在一个开放的舞台上进行创作，每一个步骤、每一个想法都能被公众所知晓和参与。它不仅仅是一种创作方式的选择，更是一种对开放、共享理念的践行，能够让更多人参与到大数据内容创造的过程中来，碰撞出更多的思维火花，推动大数据内容的创新与发展。

## 什么是 build in public
Build in public，简单来说，就是在公开的环境中进行构建和创造。具体到大数据内容创造领域，它意味着将整个创作过程透明化。从最初的创意构思，到数据的收集与整理，再到内容的撰写和完善，每一个环节都在公众的视野之下。这就好比是建造一座大楼，以往我们可能是在封闭的工地上施工，外界只能看到最终建成的样子；而 build in public 则是把工地变成一个开放的场所，让路过的人都能看到大楼是如何一砖一瓦建造起来的。在这个过程中，创作者可以随时接受公众的反馈和建议，根据大家的意见及时调整创作方向，使最终的内容更贴合大众的需求和期望。

## 为什么要 build in public：我不想把《大数据从业者们》这个社群做成一个“培训班”

我之所以选择 build in public 的方式来运营《大数据从业者们》这个社群，有着深层次的考量。我内心深处并不想把这个社群简单地打造成一个传统意义上的“培训班”。“培训班”往往有着固定的教学模式和目标，通常是由老师单方面向学员传授知识，学员更多地是被动接受。而我希望《大数据从业者们》社群是一个充满活力、互动性强的交流平台。通过 build in public 的方式，社群内的每一位成员都可以参与到内容创造的过程中，大家可以分享自己在大数据领域的经验、见解和困惑。这样一来，社群就不再是一个单向的知识传递场所，而是一个多元思想碰撞、共同成长的社区。成员们可以在这个开放的环境中相互学习、相互启发，共同探索大数据领域的无限可能。
## 我当前的写作工作流

目前，我的写作工作流是一个有条不紊的过程。首先，我会密切关注大数据领域的最新动态和热点话题，通过阅读行业报告、学术论文、新闻资讯等方式，收集丰富的素材和灵感。一旦确定了写作的主题，我会进行深入的思考和分析，构建文章的框架结构。在这个过程中，我会考虑文章的逻辑顺序、重点内容的分布以及如何更好地吸引读者的注意力。接着，我会根据框架逐步填充内容，运用自己的专业知识和实践经验，对每一个观点进行详细的阐述和论证。在写作过程中，我会不断地查阅相关资料，确保内容的准确性和可靠性。完成初稿后，我会进行多次修改和润色，检查文章的语法错误、逻辑漏洞以及表达的流畅性。同时，我也会邀请一些同行和朋友对文章进行审阅，听取他们的意见和建议，进一步完善文章的质量。

![](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/safe_image/20250325110922302.webp)

## 可能的未来：我想和 500 名大数据从业者一起写本“巨著”

我的愿景是无比宏大且充满激情的，我渴望能够和 500 名大数据从业者携手合作，共同创作一本关于大数据领域的“巨著”。大数据行业发展日新月异，每一位从业者都有着独特的经验和见解。如果能够将这 500 人的智慧汇聚在一起，那将是一股无比强大的力量。这本“巨著”将不仅仅是一本普通的书籍，它将是大数据领域实践经验的结晶，是行业发展趋势的洞察，是众多从业者思想碰撞的火花。通过这本书，我们可以向外界展示大数据行业的魅力和潜力，为更多想要了解和进入这个领域的人提供宝贵的参考和指引。同时，这也是一次大数据从业者之间深度交流和合作的机会，能够促进整个行业的发展和进步。

## 我为此做的调整
### 语雀内容不再以公开 + 密码的方式进行输出，改用协作者模式，

语雀内容不再以公开 + 密码的方式进行输出，改用协作者模式，所有加入知识星球的成员（现在联系我可以免费加入）都可以成为协作者并获得阅读权限，如果有人愿意产出内容欢迎私信我申请编辑权限。

以往采用公开 + 密码的方式输出语雀内容，虽然在一定程度上保证了内容的安全性，但也限制了成员之间的交流和参与度。
现在改用协作者模式，就像是打开了一扇更宽广的大门，让所有加入知识星球的成员都能够轻松地参与到内容的创作和阅读中来。成为协作者后，成员们可以随时查看和阅读相关内容，并且可以根据自己的兴趣和专业知识，对内容进行补充和完善。

如果有人有创作的热情和能力，愿意为“巨著”贡献自己的内容，只需要私信我申请编辑权限，就可以参与到具体的创作过程中。这样的调整能够充分调动成员们的积极性和主动性，让更多的人参与到大数据内容创造的工作中来。

### 要做一个公开的《大数据从业者们》作者花名册。

制作公开的作者花名册，就像是为大数据内容创造团队搭建了一个展示的舞台。通过这个花名册，每一位参与创作的大数据从业者都能够被大家所认识和了解。上面会记录作者的姓名、专业领域、在大数据行业的经验和成就等信息。这不仅是对作者们的一种认可和尊重，也方便成员之间相互交流和合作。同时，对于外界来说，这份花名册也是展示《大数据从业者们》社群实力和影响力的一个重要窗口，能够吸引更多优秀的大数据从业者加入到我们的创作团队中来，共同为实现创作“巨著”的愿景而努力。</content:encoded></item><item><title>堡垒机ssh通道常驻【现网连数据库】</title><link>https://blog.rockythink.work/blog/堡垒机ssh通道常驻现网连数据库</link><guid isPermaLink="true">https://blog.rockythink.work/blog/堡垒机ssh通道常驻现网连数据库</guid><description>为了数据安全，大多数据库不对外网开放，本地机器如果需要连接数据库，基本都是通过ssh通道的方式来连接。这个会让我们日常工作带来一些效率上的困扰：</description><pubDate>Wed, 12 Dec 2018 00:00:00 GMT</pubDate><content:encoded>## 场景
为了数据安全，大多数据库不对外网开放，本地机器如果需要连接数据库，基本都是通过ssh通道的方式来连接。这个会让我们日常工作带来一些效率上的困扰：
这个的基本原理是这样的：
&lt;!-- more --&gt;

你工作的电脑（客户端），是在一个外网环境下我们计作【A】好了；
数据库【比方说是mysql】所在的服务器在一个内网环境下（或者只有内网才能连接），我们计作【B】；
堡垒机和数据库在同一个内网，但可以通过外网访问，计作【C】；


我们通过Navicat或是datagrip等客户端访问数据库的时候
过程是这样的：
1、A会先通过ssh来连接C（一般是22端口）；
2、A告诉C，让C来访问B，并把B的3306端口映射到A的某一个端口（默认随机也可以指定）上；
3、然后，客户端A就可以通过访问`A自己的这个端口`间接访问B了;

但是，**并不是所以的数据库客户端都可以来配置ssh的**，比方说，我们要在A上部署个数据调度系统；

所以，我们要用一个服务来帮助我们把前两步的事情做了，然后我们只要做后一步就好了；

## 很简单
``` shell
/usr/bin/ssh -N -L 0.0.0.0:[A的端口]:[B的ip]:[B的数据库端口] [C的用户名]@[C的外网ip] -i /root/.ssh/id_rsa
```
举个🌰
```shell 
/usr/bin/ssh -N -L 0.0.0.0:3306:10.10.10.243:3306 user1@10.30.0.136 -i /root/.ssh/id_rsa
```
这样，直接连接A机器的IP和3306端口就可以了


但是这样会断掉

我们把它包装成一个后台服务吧
```shell
cd /usr/lib/systemd/system
vim db_ssh.service
```
编辑
```

Description=db_ssh

Requires=network.target

After=network.target

[Service]

Type=simple

#开始命令
ExecStart= /usr/bin/ssh -N -L 0.0.0.0:3306:10.10.10.243:3306 user1@10.30.0.136 -i /root/.ssh/id_rsa
#重启等待时间
# RestartSec=1s
#重启时机
Restart=on-failure
KillMode=process

User=root

Group=root

[Install]

WantedBy=multi-user.target
```

然后：
```shell
systemctl daemon-reload

systemctl start db_ssh.service
```
查看服务状态
```shell
systemctl start db_ssh.service
```
```
ps aux | grep ssh
```
看看进程里有没有你想看到的就好啦

祝好！</content:encoded></item><item><title>大数据就像一个大食堂，讲讲数据部门的人们都在干什么</title><link>https://blog.rockythink.work/blog/大数据就像一个大食堂讲讲数据部门的人们都在干什么</link><guid isPermaLink="true">https://blog.rockythink.work/blog/大数据就像一个大食堂讲讲数据部门的人们都在干什么</guid><description>又要开启举例模式啦。我由衷地喜爱把一些专业的知识与我们日常生活中常见的事物进行对比。在我看来，这样做有着诸多妙处，它能让原本晦涩难懂的专业知识变得更加生动鲜活，就像为枯燥的文字赋予了生命一般。而且，这种对比方式能极大地降低理解的难度，让更多人轻松领会其中的含义。熟悉我的朋友们都十分清楚，我常常会用食堂来类比一家企业的大数据。这是因为食堂的运营过程中蕴含着许多和企业大数据处理相似的逻辑，二者之间存在着奇妙的共通之处，用食堂来类比，能让大家更直观地感受到大数据在企业中的运作模式。</description><pubDate>Tue, 25 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&gt; 依然是和开篇那篇《关于大数据》相关的内容，我又要开启举例模式啦。我由衷地喜爱把一些专业的知识与我们日常生活中常见的事物进行对比。在我看来，这样做有着诸多妙处，它能让原本晦涩难懂的专业知识变得更加生动鲜活，就像为枯燥的文字赋予了生命一般。而且，这种对比方式能极大地降低理解的难度，让更多人轻松领会其中的含义。熟悉我的朋友们都十分清楚，我常常会用食堂来类比一家企业的大数据。这是因为食堂的运营过程中蕴含着许多和企业大数据处理相似的逻辑，二者之间存在着奇妙的共通之处，用食堂来类比，能让大家更直观地感受到大数据在企业中的运作模式。

## 先上图
 ![image.png](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/safe_image/20250322014620133.webp)

如图所示，展现在我们眼前的是一个食堂的`基本架构`。可别小瞧了这个看似普通的食堂架构，实际上，它也是一家企业大数据的基本架构。这种相似性就如同隐藏在生活角落里的宝藏，一旦被发现，就能为我们理解大数据打开一扇全新的大门。每次我走到公司食堂的时候，脑海中都会不由自主地浮现出我们日常所做的工作。在这个奇妙的类比里，我们就像是食堂里各司其职的工作人员，有的如同技艺精湛的厨师，凭借着专业的技能和丰富的经验，`对数据进行精心的加工和处理`；有的好似细致认真的备菜员，仔细地挑选和准备数据原材料；还有的就像负责管理仓库的管理员，用心地保管和整理数据，确保数据的安全和有序。

首先，在没有数据中台，或者数据仓库之前，所有的数据都是散落在各个业务系统和其他地方的。这就好比是一个热闹非凡的菜市场，里面摆满了各种各样没有被加工过的原始材料。你看那满是泥巴的胡萝卜，带着泥土的芬芳，却还保留着未经雕琢的原始模样；还有那打了农药的青菜，虽然带着一些瑕疵，但却蕴含着成为美味佳肴的潜力。`这些原始数据就如同菜市场里的蔬菜，杂乱无章地分布着，等待着被发掘和利用。` 

我们通过数据同步手段，将我们需要的这些原始胡萝卜（原始数据），集中到一起。这个过程就像是食堂的采购人员，在菜市场中精心挑选我们需要的食材，然后把它们集中采购回来，这在大数据领域俗称采购`（数据集成/数据上云）`。接着，我们把采购来的瓜果蔬菜放在一个仓库中的一个房间里等待下一步处理，这个房间我们称为 `ODS（Operational Data Store）`。这个房间就像是一个临时的中转站，各种数据在这里暂时存放，等待着被进一步加工和处理。

下一步，我们要对这些脏兮兮的原材料（原始数据）进行`清洗` - 去皮。想象一下，那些带着泥巴的胡萝卜，经过我们的清洗和去皮，变得干净整洁，就像数据经过清洗后去除了杂质和错误，变得更加纯净和可用。然后，我们把处理好的数据`转运`到另外一个房间`CDM（Common Data Model）`，并将它们放在事先设计好的`货架（数据模型表）`上。这些货架就像是图书馆里的书架，每一层都有明确的分类和标识，以便可以让大家方便`高效的找到所需的数据`，随要随取。`模型`可以理解成是一堆表格的设计，后面会详细说明。设计这些货架（表）的工作我们叫做`模型设计`，它的目的就是让数据`井然有序`，就像给图书馆的书籍进行合理分类一样。同时，我们还要考虑以后`方便扩展`更多的货架，以应对不断增长的数据需求。

到了这一步，原材料就准备好了，随时等待顾客上门点菜。

这个时候有个顾客`（数据运营/业务人员）`来了，说要吃一碗番茄炒蛋`（数据报告）`。这个订单被传送到厨师`（数据分析师）`的面前，厨师开始认真分析，根据多年的经验和专业知识，判断出需要一个番茄两个鸡蛋。然后，厨师从仓库中取走自己需要的番茄和鸡蛋。接着，厨师熟练地将番茄切成块，把鸡蛋搅散，然后丢到锅里一顿操作，就像施展魔法一样，一盘美味的番茄炒鸡蛋做好了。在大数据的世界里，数据分析师就像这位厨师，根据业务需求，从数据仓库中提取所需的数据，经过一系列的分析和处理，最终生成满足需求的`数据报告`。

后来数据分析师发现太多人都爱吃番茄炒蛋了，为了`提高效率`，`节省人力`，就建议买个自动炒菜机器人`（BI 系统）`。这样一来，当顾客要吃番茄炒蛋的时候，就可以自动让它来做好了。使用自动炒菜机器人不仅能节省人力，而且还能提高效率，保证菜品的质量稳定。同时，数据分析师跟仓库说，让他们顺便把番茄切好，鸡蛋也准备好。于是，仓库又新增了一个房间叫 `ADS（Application Data Store）`，`专门用来处理 CDM 房间的货`。在这个房间里，工作人员根据菜单上不同的菜，提前备好食材，该切块的切块，该切丝的切丝。这样对于`畅销的几个菜品`，食堂制作起来就更高效了。在大数据领域，`ADS 就像是一个专门为热门数据需求准备的“预制菜”仓库，能快速响应业务需求，提高数据处理的效率`。

这个模式大大提高了食堂的工作效率，所有工作都有条不紊的进行。就像一个运转良好的机器，`每个环节都紧密配合`，`各司其职`，为顾客提供优质的服务。

随着时间推移，应顾客`(数据运营/业务人员)`的要求食堂增加了`新的菜品`，设计了新的菜单。这就意味着食堂从原材料到仓库货架都需要再做`调整`。原来的材料怎么办呢？那些`长期不怎么用`的食材放在货架上也是`浪费空间`，就像一些陈旧的数据，如果一直保留在数据仓库中，不仅会占用大量的`存储空间`，还会影响数据的查询和处理效率。而且，`原材料的品质不稳定`也会导致顾客拉肚子等问题，在大数据领域，这就相当于`数据的质量出现问题`，会影响`数据分析`的结果和`业务决策`的`准确性`。

那么，如何处理这些问题呢？以后又如何避免类似的问题发生呢？还有，放`贵重食材`的货架要`多上几把锁`才行，在大数据中，这就意味着要加强对重要`数据的安全保护`。这些问题，都需要处理和解决，解决这些问题的工作在大数据食堂里叫做`数据治理`。数据治理就像是食堂的管理团队，负责协调各个环节的工作，确保食堂的正常运营和`数据的质量、安全`。

那`建立`这么一个有条不紊的大食堂总会有个`统筹`的人吧，这个统筹的人我们叫`数据架构`。数据架构就像是食堂的`总设计师`，他要规划食堂的`整体布局`，制定各项`规章制度`，`协调`各个部门之间的`工作`，确保食堂能够`高效、稳定地运行`。在大数据领域，数据架构师负责`设计和规划企业的大数据架构`，确保数据能够在`各个系统之间顺畅流动`，为企业的业务发展提供有力的支持。</content:encoded></item><item><title>如何成为一名独立开发者，并以此来养活自己</title><link>https://blog.rockythink.work/blog/如何成为一名独立开发者并以此来养活自己</link><guid isPermaLink="true">https://blog.rockythink.work/blog/如何成为一名独立开发者并以此来养活自己</guid><description>这个这个这个</description><pubDate>Thu, 16 Jan 2025 00:00:00 GMT</pubDate><content:encoded>最近的一段时间，独立开发者这个名词似乎在网络上越来越流行了，我想原因应该是最近大环境不好，很多人都失业了吧，从我自己的体验上来看，也有一部分原因，是对下份工作没有信心。

当然，大家每个人的情况不同，但无外乎就两个原因，找不到工作或是不想找工作。

其实就是没有合适的工作，像我这样毕业10年的人来说，有一点积累但不多，家庭的压力又很大。所以往往对新工作还是有一定要求的，经历了世间的一些冷暖后，悟到了一些人生的意义，开始节约时间陪着家人，</content:encoded></item><item><title>对当下AI的理解及想法1：中国不会在AI领域有世界领先的发展</title><link>https://blog.rockythink.work/blog/对当下ai的理解及想法1中国不会在ai领域有世界领先的发展</link><guid isPermaLink="true">https://blog.rockythink.work/blog/对当下ai的理解及想法1中国不会在ai领域有世界领先的发展</guid><description>AI当前真的是如火如荼啊，到处都充斥着新技术和新突破，在我有限的认知下，我谈谈我自己的一些想法。</description><pubDate>Wed, 03 Jul 2024 00:00:00 GMT</pubDate><content:encoded>大家好哈，其实我不太会写这样的文章，但我还是忍不住有很多想法希望表达出来。

说几个当前的观点吧：

## 中国不会在AI领域有世界领先的发展；

这个问题其实很多人都有这样的观点，我结合自己的思想总结一下：

* 首先从维基百科上看，截至到2020年3月25日，网页内容为中文的占比为1.3%，AI需要大量的内容数据做训练，所以，我们在这方面是有明显劣势的。
![20240711041917](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240711041917.png)

* 其次，我们受到的限制多：

这个也很好理解，其实“聪明的人”都知道，现在国内的互联网上充斥着反智的内容，各种为了流量胡说八道的人太多了，流量还希望往哪个地方聚集，其实就是说真话的人没有，对于同样的话题，真正有见解的人不敢说，所以导致了胡说的人感觉上充斥了网络，只是敢说真话的人太少了。

那么，对于AI来说，多元化的观点和符合辩证思维，遵循因果定律的内容太重要了，举个不恰当的例子，如果AI是个人，那么我们给他吃的“垃圾”太多了。真正能符合思维逻辑的内容还不够。

这是另一个差距。

* 再者，我们没有一个技术环境来真正去做这个事情

虽然我是一个互联网从业者，可身边其实没有真正在做AI的人，沾上边的，都是在做AI的应用，应用固然重要，普通人最多也只能做这些。

但问题在于，真正在做AI的人，他们有好的环境吗，我不知道，我相信这个和人的价值观有关系，和中国企业的价值观有关系，更何况是在当前这样的经济环境下。

可能有人会说，当前AI是热点，资本会不断往里投的，但我想说，其实企业在这个事情上很难进行。因为如果要做AI的底层，那么，他的投入产出比非常低，即使你未来可能会成功，但可能在你还没有成功的时候，自己就活不下去了，加上做AI的公司这么多，大家在这种竞争环境下，更加不会注重沉淀，他们要的是我要超过XXX，他们要的不是我要成为XXX。

这不是科研精神。

* 最后，差距的两极分化

ChatGPT很强了，应该是当前最强，AI的技术发展是“涌现”，我们一步跟不上，步步跟不上。我找不出我们对标国外之下的优势。

这会带来两个结果，一个是企业没有市场做不下去了，自然无从谈发展；

另外一个是，国外开源了，我可以直接抄，这个成本是最低的，收益也是最高的，技术上有句话是“何必自己造轮子”，既然别人都已经实现了，那我直接拿来用就好了，为什么做一个一模一样的东西，还不一定比别人好。

那么你的核心是去抄了，自然也没有了发展。

## 预测

我胡说八道来预测一下，AI应用未来会是国内的核心，类似个人助理，私有化大模型，这些。

中国在互联网上的优势，一直都不是底层技术，我们的应用做的很好，Tiktok就很说明问题，我们用的哪个技术底层不是来自别人开发的技术语言啊，我们用的底层服务哪个不是别人的技术沉淀啊。

我们尝试从应用层往下探，但几乎永远完成不了从底层超越，因为底层的格局已经定型了。

就像Java一样，很难再有一门语言能代替它了，因为他已经深入到我们的每个角落。

好啦，随便说说，切勿当真。


后面有时间，我会再谈一谈，我认为未来AI对我们的影响。

See you！</content:encoded></item><item><title>我是如何考虑个人博客这件事情的</title><link>https://blog.rockythink.work/blog/我是如何考虑个人博客这件事情的</link><guid isPermaLink="true">https://blog.rockythink.work/blog/我是如何考虑个人博客这件事情的</guid><description>人博客这个事情，早在十几年前，我还是一名学生的时候就已经在做了，但总是坚持不下来，到现在来来回回，折腾了好几次这个事情了，那个时候穷，没钱买域名，也没钱买服务器，基本上能白嫖的绝不花钱，加上其实当时也没有多少东西可以分享的，毕竟只是一名学生嘛，就算想写点什么，那估计也是没有什么实质内容的胡扯（当然，我现在也觉得自己也总是在胡扯），所以感兴趣的朋友就随便看看，切勿认真。</description><pubDate>Thu, 06 Jun 2024 00:00:00 GMT</pubDate><content:encoded>![20240623031308](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240623031308.png)
个人博客这个事情，早在十几年前，我还是一名学生的时候就已经在做了，但总是坚持不下来，到现在来来回回，折腾了好几次这个事情了，那个时候穷，没钱买域名，也没钱买服务器，基本上能白嫖的绝不花钱，加上其实当时也没有多少东西可以分享的，毕竟只是一名学生嘛，就算想写点什么，那估计也是没有什么实质内容的胡扯（当然，我现在也觉得自己也总是在胡扯），所以感兴趣的朋友就随便看看，切勿认真。

有的时候做事情就是这样三分钟热度，新鲜劲过去了，也就索然无味了，大家都说这样不好，不过我看来并非如此，我认为人生中大多数的时间都是在做无意义的事情，所以人要给自己足够的空间，来允许自己做一些和功利无关的事情，哪怕会让别人笑话。

说回博客的事情哈，跑题了差点

首先呢，先说说我做博客的目的，我总结了一下，本质上就是一种倾诉欲，一种假设，可以骗过自己的假设，年过30了，身边的朋友越来越少，即使上家人，他们也都在看(kān)着你，而不是在看(kàn)着你，我不知道大家是否有同样的体会，懂你的人其实很少，做学生的时候，也没有人懂自己，但那个时候是有希望的，因为你看不到未来的自己会是什么样子的，根本也不会考虑自己有没有被别人看懂的问题

我现在想来好像是这样的

但是现在不一样了，有一些想法还是希望可以被留下来的，即使他就是一堆狗屎，我假设是有人看得懂的。

所以无论是技术还是生活方面，我都会分享一些

那么，我做个人博客的目的是为了分享，倾诉和个人满足。

这样，就有人问了，那为什么要自建博客呢，其实很多像是简书啊，知乎啊，或者CSDN这样的地方都可以写博客，我为什么要自建站呢？

**自由**

既然我们做博客的目的不是为了赚钱，不是为了成为网红，我们并不在意博客平台可以给我们带来的流量，有多少人看就有多少人看吧，无所谓，但要自由，想说什么就说什么，哪怕是一坨，也要说出来，不追求再多，就是有这么一个随心所欲，信口开河的地方。

别的什么资产不是自己的，这样的理由是对的，但我并不在乎这些

&gt; 如果屏幕前的你能读到这里，我真的很开心，你已经听我啰啰嗦嗦这么多了呢

我们继续，那么又有人问了，是用动态站点好呢还是静态好呢，这个问题其实我纠结了很久，最后还是选择了静态

我是这么考虑的
* 第一：从成本的考虑，静态博客基本上没有成本，我们可以做github pages、cloudflare pages，这些服务都是免费的，而且又免费的CDN
* 第二：从安全考虑，静态博客没有数据库，没有后端服务，没有用户数据，唯一“值钱”的就是几篇破文章，丢不了
* **第三：**这是我认为最重要的原因，那就是累了，我之前玩过wordpress，现在很火的halo我浅玩了一下，说句老实话，真心都不错，很多功能和样式，各种插件主题，对于任何有技术控的男孩子还说还真有诱惑力，可我根据自己先前的经验，当我开始玩这些的时候，大部分的时间，都是在玩网站本身，换主题太方便了，我没事就去找找有没有更好看的主题，这个插件据说可以优化SEO，来研究研究。—— 然后时间都耗在了这个上面，逐渐失去了做个人博客本来的目的

所以，我选择使用静态博客，没有评论功能，没有花里胡哨的特效，上面只有文章，我甚至不想有任何人认识我，成就感要来自于内容，内容，内容。

那静态博客的框架有很多，我随机选择了Astro，别问我为什么，我只是随便选的，美观，简单，能用就好

好了，不过在使用Astro的时候，我还是遇到一点坑的，有时间我慢慢整理出来分享给你，现在用的主题叫[astropaper](https://astro.build/themes/details/astropaper/)，如果没记错的话，应该是一位缅甸人写的，我就是看着顺眼，就使用了这个。
后面我也会分享一些这个主题的使用技巧，它对中文的支持不够友好，所以作为中文博客来用的话，还是有点需要修改的地方的。我不是搞前端的，所以我也不是很懂，找了一个做前端的朋友帮忙才搞定的。

那么，现在就分享到这里吧，我不知道有没有吧自己想说的都说了出来，就这样吧，如果后面想到了什么，再上来改。。

See you Friend!</content:encoded></item><item><title>探索RFM模型：用户运营与数据运营的深度融合</title><link>https://blog.rockythink.work/blog/探索rfm模型用户运营与数据运营的深度融合</link><guid isPermaLink="true">https://blog.rockythink.work/blog/探索rfm模型用户运营与数据运营的深度融合</guid><description>初春的午后，阳光透过落地窗洒在办公桌上，李明正专注地研究着电脑屏幕上的数据报表。作为一名资深用户运营专家，他深知在当今数字化商业环境中，RFM模型对于用户运营的重要性。然而，如何将这一模型与日常运营工作紧密结合，并发挥其最大价值，仍是一个值得深入探讨的课题。</description><pubDate>Tue, 25 Mar 2025 00:00:00 GMT</pubDate><content:encoded>#### 初春的午后，阳光透过落地窗洒在办公桌上，李明正专注地研究着电脑屏幕上的数据报表。作为一名资深用户运营专家，他深知在当今数字化商业环境中，RFM模型对于用户运营的重要性。然而，如何将这一模型与日常运营工作紧密结合，并发挥其最大价值，仍是一个值得深入探讨的课题。
#### 时间：2024年4月的一个午后  
地点：某互联网公司总部大楼的会议室  
人物：李明（用户运营专家）、王婷（数据运营专员）、张华（数据分析师）
#### 事件的起因
李明、王婷和张华三人受邀参加公司内部的一场关于RFM模型的专题研讨会。会议旨在探讨用户运营和数据运营人员对RFM模型的认知差异，以及如何更好地利用这一模型提升用户价值。
#### 事件的经过
会议一开始，李明率先发言：“作为用户运营人员，我们每天都在与用户直接互动。RFM模型对我们来说，是一个划分用户群体的有力工具。通过分析用户的最近购买时间、购买频率和购买金额，我们可以更精准地了解用户的需求和行为特征，从而制定更有针对性的营销策略。”
王婷接着说：“在数据运营方面，我们更关注数据的质量和准确性。RFM模型的应用需要我们确保数据的及时更新和清洗，以保证模型输出的可靠性。我们还需要对数据进行多维度的分析，以发现潜在的用户行为模式，为运营决策提供数据支持。”
张华作为数据分析师，则从另一个角度阐述了他的观点：“数据分析师的任务不仅仅是构建和优化模型，更重要的是深入挖掘数据背后的规律。我们会通过不断的调整和验证，探索不同行业、不同业务场景下RFM模型的参数设置，甚至尝试将其他相关变量纳入模型，以提升其预测准确性和有效性。”
#### RFM模型的定义与用户标签
RFM模型是一种基于用户行为数据的客户细分模型，通过三个关键指标来衡量用户的价值和行为特征：
- **R（Recency）**：最近一次购买时间，反映用户的活跃程度。
- **F（Frequency）**：购买频率，反映用户对产品或服务的需求和忠诚度。
- **M（Monetary）**：购买金额，反映用户的消费能力和对企业的贡献。
根据这三个指标，RFM模型可以将用户划分为不同的群体，并赋予特定的标签。例如：
- **重要价值用户**：最近购买时间近、购买频率高、购买金额大，是企业最优质的客户群体。
- **重要发展用户**：购买频率和购买金额较高，但最近购买时间较远，需要通过营销手段重新激活。
- **重要保持用户**：最近购买时间和购买金额较高，但购买频率较低，需要通过激励措施增加购买次数。
- **重要挽留用户**：各项指标都较低，需要深入分析流失原因并采取挽回措施。
#### 数据运营视角下的用户运营动作细节
##### 重要价值用户
- **数据监测**：持续密切监控重要价值用户的消费数据，涵盖购买时间、金额、品类偏好等。运用数据可视化工具，实时呈现他们的消费动态，构建专属的数据看板。例如，当发现某重要价值用户近期购买某类产品的金额有所下降时，及时发出预警。
- **个性化服务数据支撑**：收集并分析用户的历史反馈、浏览记录、社交互动等多源数据，为他们提供高度个性化的服务。比如，依据用户的浏览历史，精准推荐符合其兴趣的新品；根据其过往购买习惯，提供定制化的产品组合方案。
- **忠诚度计划数据优化**：借助数据评估现有的忠诚度计划效果，依据用户反馈和消费数据进行动态调整。例如，若发现用户对积分兑换礼品的参与度不高，分析礼品种类和兑换规则，及时优化。
- **专属活动数据驱动**：根据用户的消费数据和偏好，策划专属的线下品鉴会、高端会员沙龙等活动。活动前，通过数据预测参与人数和效果；活动中，实时收集用户反馈数据；活动后，分析活动对用户消费行为的影响。
##### 重要发展用户
- **数据精准营销**：整合用户的购买历史、浏览行为、搜索关键词等数据，制定精准的营销内容。例如，若用户之前购买过运动装备，可推送运动相关的新品、优惠活动等信息。同时，运用A/B测试，对比不同营销内容和渠道的效果，选择最优方案。
- **唤醒策略数据评估**：定期分析唤醒策略的数据效果，如邮件、短信的打开率、点击率，活动的参与率等。根据评估结果，调整唤醒频率、内容和渠道。若发现某类用户对短信营销反应较好，可适当增加短信推送的频率。
- **用户需求数据挖掘**：深入分析用户的历史数据，挖掘潜在需求。通过用户调研、数据分析等方式，了解他们未被满足的需求，为产品和服务的改进提供方向。
##### 重要保持用户
- **激励措施数据设计**：分析用户的消费习惯和偏好数据，设计有针对性的激励措施。例如，对于喜欢购买特定品类产品的用户，提供该品类的专属折扣或满减活动；对于消费金额较高但频率低的用户，推出消费满一定金额赠送高价值礼品的活动。
- **互动活动数据引导**：策划互动活动，如产品评测、用户故事分享等，并通过数据引导用户参与。分析用户的参与数据，了解他们对不同活动形式的喜好，优化活动方案。
- **购买频率数据预测**：建立购买频率预测模型，根据用户的历史数据和当前行为，预测他们的下一次购买时间。提前推送相关的营销信息和激励措施，提高购买频率。
##### 重要挽留用户
- **流失原因数据诊断**：综合分析用户的消费数据、行为数据和反馈数据，找出流失的原因。例如，通过分析用户的投诉记录、购买间隔时间、浏览行为等，判断是产品质量问题、服务问题还是竞争对手的影响。
- **挽回策略数据定制**：根据流失原因和用户的历史数据，定制个性化的挽回策略。对于因价格原因流失的用户，提供限时折扣或优惠券；对于因服务问题流失的用户，提供专属的服务承诺和解决方案。
- **挽回效果数据跟踪**：建立挽回效果跟踪机制，实时监测用户的反馈和行为数据。评估挽回策略的有效性，若效果不佳，及时调整策略。
#### 一般用户群体的策略
对于一般价值用户、一般发展用户、一般保持用户和一般挽留用户，企业可以通过定期发送通用的营销信息，如新品推荐、促销活动等，提高他们的关注度和认知度。同时，建立用户反馈机制，鼓励他们提出意见和建议。数据运营人员要分析营销信息的发送频率、内容类型、渠道选择等数据，优化营销效果。例如，通过分析不同时间段发送邮件的打开率，确定最佳的发送时间；通过对比不同渠道的点击率，选择最有效的推广渠道。
#### RFM模型的延伸
RFM模型的价值不仅限于其本身。通过举一反三，企业可以创造出更多类似的模型。例如，在电商行业中，可以考虑用户的浏览行为、收藏行为、分享行为等因素，构建更全面的用户价值评估模型。在金融行业中，可以结合用户的信用评级、资产规模、投资偏好等信息，对客户进行更精准的细分和管理。数据运营人员要负责收集、整理和分析这些新增变量的数据，确保模型的准确性和有效性。
#### 事件的结果
经过深入的讨论，李明、王婷和张华达成了一致意见：RFM模型是用户运营和数据运营的重要工具，但需要根据不同业务场景和行业特点进行灵活应用和不断创新。通过跨部门的紧密合作，他们可以更好地利用这一模型，提升用户价值，推动企业业务的发展。
#### 结尾
阳光依旧温暖，李明合上笔记本电脑，心中充满了对未来的期待。他知道，在数字化浪潮中，只有不断学习和创新，才能在激烈的市场竞争中立于不败之地。

#### 延伸阅读

想要深入学习用户运营和数据分析的相关知识？我在 **[拾穗数据](https://pro.ss-data.cc?utm_source=blog&amp;utm_campaign=rfm_model)** 知识库中整理了完整的数据分析学习体系，包括用户画像构建、数据模型应用、商业分析实战等内容，让数据学习变得有温度有深度。</content:encoded></item><item><title>Flink 在大数据开发中的应用（实时数据分析和处理）</title><link>https://blog.rockythink.work/blog/flink-在大数据开发中的应用实时数据分析和处理</link><guid isPermaLink="true">https://blog.rockythink.work/blog/flink-在大数据开发中的应用实时数据分析和处理</guid><description>在当今快节奏的商业环境中，实时数据分析成为企业获取竞争优势的关键能力。通过对实时数据进行分析，企业可以快速应对市场变化、做出更精准的业务决策。无论是金融、零售还是物联网领域，实时数据流的处理需求愈发重要。Apache Flink，作为一款开源的分布式流处理框架，以其强大的实时数据处理能力和低延迟特性，在大数据实时分析领域备受推崇。本文将详细介绍 Flink 在实时数据分析与处理中的应用，结合 PyFlink 和 Flink SQL 的实操步骤，帮助开发者快速掌握 Flink 的实时流处理技巧。</description><pubDate>Sun, 22 Sep 2024 00:00:00 GMT</pubDate><content:encoded>#### **引言**

在当今快节奏的商业环境中，实时数据分析成为企业获取竞争优势的关键能力。通过对实时数据进行分析，企业可以快速应对市场变化、做出更精准的业务决策。无论是金融、零售还是物联网领域，实时数据流的处理需求愈发重要。Apache Flink，作为一款开源的分布式流处理框架，以其强大的实时数据处理能力和低延迟特性，在大数据实时分析领域备受推崇。本文将详细介绍 Flink 在实时数据分析与处理中的应用，结合 PyFlink 和 Flink SQL 的实操步骤，帮助开发者快速掌握 Flink 的实时流处理技巧。

---

#### **一、Flink 与实时数据分析**

实时数据分析的核心是对**事件时间**（event-time）进行处理，这与传统的批处理模式截然不同。通过在数据到达时进行处理，实时数据分析可以帮助企业实时监控关键指标、发现异常并采取行动。以下是常见的实时数据分析场景：
- **电商**：实时分析用户的点击行为，向用户推荐个性化商品。
- **金融**：实时监控交易数据，进行欺诈检测。
- **物联网**：实时处理传感器数据，预测设备故障并发出警报。

Flink 的核心优势在于支持事件时间的流处理模型、低延迟和强大的状态管理功能，使其能够处理大量实时数据流。Flink 既可以进行批处理，也可以进行流处理，灵活适应各种业务需求。

---

#### **二、Flink 的核心架构与组件**

为了构建一个完整的实时数据处理系统，Flink 通常与以下组件集成使用：
- **Apache Kafka**：用于收集和传输实时数据流，起到消息队列的作用。
- **Flink**：核心流处理引擎，负责实时数据的处理和分析。
- **Elasticsearch 或 HDFS**：存储处理后的数据，供后续查询和分析。
- **Flink SQL 或 DataStream API**：用于定义数据处理逻辑。

在一个典型的实时数据分析系统中，数据通过 Kafka 产生，Flink 消费 Kafka 中的数据流进行处理和分析，最后将结果存储到 Elasticsearch 中，以供可视化或查询。

---

#### **三、实操指南：使用 PyFlink 和 Flink SQL 进行实时点击流分析**

接下来，我们通过一个具体的案例，展示如何使用 PyFlink 和 Flink SQL 实现实时点击流分析。假设我们有一个电商平台，我们需要实时分析用户的点击行为，以统计每个产品的点击次数。

##### **1. 准备工作**

在进行开发之前，我们需要准备以下环境：
- **Apache Kafka**：作为消息队列，用于收集和传输用户的点击流数据。
- **Apache Flink**：用于处理实时点击流数据。
- **Elasticsearch**：存储处理后的点击统计数据，供后续查询和可视化。

确保已经安装了 PyFlink 和 Flink SQL，可以通过以下命令安装 PyFlink：

```bash
pip install apache-flink
```

##### **2. 使用 PyFlink 处理点击流数据**

我们首先使用 PyFlink 来处理点击流数据。以下是一个完整的 PyFlink 作业，它从 Kafka 消费点击流数据，解析并统计每 10 秒内每个产品的点击次数。

```python
from pyflink.datastream import StreamExecutionEnvironment
from pyflink.datastream.connectors.kafka import FlinkKafkaConsumer
from pyflink.common.serialization import SimpleStringSchema
from pyflink.common.typeinfo import Types
from pyflink.common.time import Time

import json

# 设置执行环境
env = StreamExecutionEnvironment.get_execution_environment()

# 设置 Kafka 消费者配置
properties = {
    &apos;bootstrap.servers&apos;: &apos;localhost:9092&apos;,
    &apos;group.id&apos;: &apos;click-stream-group&apos;
}

# 创建 Kafka 消费者
kafka_consumer = FlinkKafkaConsumer(
    topics=&apos;click-stream&apos;,
    deserialization_schema=SimpleStringSchema(),
    properties=properties
)

# 从 Kafka 中获取数据
click_stream = env.add_source(kafka_consumer)

# 处理点击流数据：提取 productId 并计数
product_clicks = (click_stream
                  .map(lambda value: json.loads(value)[&apos;productId&apos;], output_type=Types.STRING())
                  .key_by(lambda productId: productId)
                  .time_window(Time.seconds(10))
                  .reduce(lambda a, b: a + 1))

# 输出结果
product_clicks.print()

# 执行作业
env.execute(&apos;PyFlink ClickStream Analysis&apos;)
```

**代码说明**：
- **Kafka 消费者**：通过 Kafka 消费点击流数据。
- **数据处理**：提取 `productId`，并使用 Flink 的窗口操作，每 10 秒统计一次产品点击次数。
- **输出结果**：打印每个产品的点击次数。

##### **3. 使用 Flink SQL 处理点击流数据**

接下来，我们使用 Flink SQL 实现相同的实时点击流分析。Flink SQL 提供了一种更为简洁的方法，允许用户像查询数据库一样处理流数据。

首先，启动 Flink 集群并进入 Flink SQL CLI：

```bash
bin/start-cluster.sh
bin/sql-client.sh
```

**创建 Kafka 表**：
```sql
CREATE TABLE click_stream (
  userId STRING,
  productId STRING,
  timestamp TIMESTAMP(3),
  action STRING,
  WATERMARK FOR timestamp AS timestamp - INTERVAL &apos;5&apos; SECOND
) WITH (
  &apos;connector&apos; = &apos;kafka&apos;,
  &apos;topic&apos; = &apos;click-stream&apos;,
  &apos;properties.bootstrap.servers&apos; = &apos;localhost:9092&apos;,
  &apos;format&apos; = &apos;json&apos;
);
```

这段 SQL 创建了一个 Kafka 表 `click_stream`，用于接收用户的点击流数据。

**执行实时统计查询**：
```sql
SELECT
  TUMBLE_START(timestamp, INTERVAL &apos;10&apos; SECOND) AS window_start,
  productId,
  COUNT(*) AS click_count
FROM click_stream
GROUP BY
  TUMBLE(timestamp, INTERVAL &apos;10&apos; SECOND),
  productId;
```

通过 Flink SQL，我们可以轻松统计每 10 秒内每个产品的点击次数。相比 PyFlink，Flink SQL 提供了更简洁的方式来处理流数据，非常适合业务分析人员或需要快速构建流处理管道的场景。

##### **4. 将结果写入 Elasticsearch**

无论是使用 PyFlink 还是 Flink SQL，我们都可以将处理后的点击统计结果写入 Elasticsearch，供后续查询或可视化展示。以下是在 Flink SQL 中将结果写入 Elasticsearch 的方式：

```sql
CREATE TABLE click_results (
  window_start TIMESTAMP(3),
  productId STRING,
  click_count BIGINT
) WITH (
  &apos;connector&apos; = &apos;elasticsearch-7&apos;,
  &apos;hosts&apos; = &apos;http://localhost:9200&apos;,
  &apos;index&apos; = &apos;click-results&apos;,
  &apos;document-type&apos; = &apos;_doc&apos;
);

INSERT INTO click_results
SELECT
  TUMBLE_START(timestamp, INTERVAL &apos;10&apos; SECOND) AS window_start,
  productId,
  COUNT(*) AS click_count
FROM click_stream
GROUP BY
  TUMBLE(timestamp, INTERVAL &apos;10&apos; SECOND),
  productId;
```

这段 SQL 将点击统计结果插入到 Elasticsearch 的 `click-results` 索引中，供后续的数据查询或可视化。

---

#### **四、总结**

这里展示了如何使用 PyFlink 和 Flink SQL 实现实时点击流数据的处理与分析。Flink 强大的流处理能力使其成为大数据实时分析的理想工具，无论是电商、金融还是物联网等领域，Flink 都能够高效处理海量数据，帮助企业做出快速、准确的决策。

- **PyFlink**：提供了灵活的 Python API，适合开发人员编写复杂的流处理逻辑。
- **Flink SQL**：提供了简洁的 SQL 接口，非常适合需要快速实现流处理的场景。</content:encoded></item><item><title>教育孩子，本质是教给他获得幸福的能力</title><link>https://blog.rockythink.work/blog/教育孩子本质是教给他获得幸福的能力</link><guid isPermaLink="true">https://blog.rockythink.work/blog/教育孩子本质是教给他获得幸福的能力</guid><description>从来没有分享过自己在家庭教育上的心得，今天突然想把自己的一点想法给写下来了，主题是教育就是让孩子拥有获得幸福的能力。</description><pubDate>Tue, 01 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&gt; 从来没有分享过自己在家庭教育上的心得，今天突然想把自己的一点想法给写下来了，主题是——教育就是让孩子拥有获得幸福的能力。

这几十年间技术的突飞猛进，生产力早已经可以满足几乎所有人的温饱问题，我相信未来也是一样，不会有人会因为生存而苦恼。我指的生存是吃饱穿暖，这一点相信不会有人反驳吧。

那么这和教育有什么关系呢？

在过去，甚至就在20年前，吃一次红烧肉就和过年一样，我从小生活在一个偏远农村的一个普通家庭，那个时候父母的焦虑是：不好好学习知识，以后靠什么生存，靠什么吃饭呢？本质上是对孩子未来生存的焦虑，现在我们所关心的幸福，我想当时的大多数父母是没有考虑这一点的，因为在他们的经历中，是经历了一段吃不饱饭的时光的，而且也无法预判未来经济带来的生产力变革，所以他们认为生存技能是教育的第一要义。

现在不同，生存已不再是问题，但为什么现在人的幸福感却没有提高呢？我想应该是高速经济发展的一些副作用吧：人们开始卷起来了，“红烧肉”已经满足不了人们的需求了，人们要实现自己的价值，要得到别人的尊重，要成为人上人。

有意思的是，这其实是很难实现的，我见过很多“层次”的人（我当然不会给我的朋友们划分层级，他们在我的眼中是平等的）。但却有很多人的目标是成为另一类人，他们认为别人在实现自己的价值，而自己当前的状态却是碌碌无为，总感觉自己比别人低一个层次。

我在每个经济层次的人身上都看到过这一点，而你在羡慕比自己更有钱或者更能获得别人尊重的人的时候，别人也在羡慕你，但你不关心那些羡慕你的人，甚至你不屑与这些人交流，你觉得与这些人交流对自己没有什么价值，他们帮不了你什么。而实际上你羡慕的那些人也会这么想，为了防止他们用一样的态度待你，所以你开始“装”起来了，假装自己和他们是同一层次的人，以便自己可以真正的成为他们中的一员。


&gt; 中国几乎所有的励志故事都好像是一个人翻盘的故事，大致的剧情就是一个人从一个穷人，通过努力变成一名收人尊敬的富翁。这样的故事并非不好，但是他给人一种暗示，钱与权才是人生的最大目标。

那么，我想表达的是——
**钱不是目标，权力也不是目标，别人的尊重也不是目标，人生的意义根本和“目标”无关，人的最终目的地都是坟墓，所谓的目标都是虚无。**

***那人生的意义是什么？***

答案是——***更多更多的快乐！**！！！

马云和你相比到底谁更快乐，这并不好说。大多数人一定认为是马云更快乐一些，因为他有钱，有地位、有无数的人尊重他，他住着普通人买不起的房子，坐着普通人买不起的车，他几乎可以做你现在想做的任何事情。

但我相信并不是这样的，他也非常多自己烦恼的事情，只是我们并不会关心这一点，我们总是困在自己的难题中，认为如果自己拥有和马云一样的资源就解决了一切问题，并获得幸福，幻想自己可以在家人和朋友面前获得的各种“尊重”和优越感。实际的情况是，等你成为了马云，你的家人、你的朋友已经不再是这些人了，他们可能会是马化腾、雷军、各路明星、政府要员。你想象的尊重和优越感并不会发生在他们身上，而你此刻的朋友即便和你想象中一样仰望着你，你也不再在意了，***你不止更新了自己所拥有的，也更新了欲望。所以你并不会变的更快乐。***

任何人在任何阶段，都会有不同的烦恼，也许和王尔德说的一样，无论你是什么人，这一生中烦恼的总量是不变的。

那么幸福到底和什么有关呢？***我认为是面对人生的态度，具体点就是面对问题的态度。***

相信大家都回忆过自己小时候是多么害怕被老师叫家长，但现在想想是多小的一件事情啊。我对这个现象的看法是这样的：小时候这种体验必然的，也是非常重要的，只是有一点我们忽略的是，即使同样的经历和焦虑，不同的我们还是在焦虑这个事情上有不同程度的差别，有的孩子可能害怕到睡不着觉，有的孩子可能在努力思考如何解决自己遇到的问题，第二天自己应该如何应对老师和父母的责骂，才能让这件事情尽快平息下去。

*这就是我想说的，获得幸福的能力，显然第一种孩子会更痛苦一些，相比之下，第二种孩子更幸福。*

所以我应该如何让自己的孩子成为第二种呢，我不知道，但我的确在不同的事情请这么去做了，这里我并不会分享我是用了什么办法，因为我没有任何办法，随机应变而已。而且我的办法不一定合适所有人和所有情况。

即便这样，我还是想说，作为家长，我们心里应该有一个意识常在，时刻提醒我们，要让孩子拥有获得幸福的能力，而非仅仅是生存技能，生存技能只是包含在获得幸福的能力之中，而且占比很小。这个能力是获得快乐的能力，即使未来他就是一个世俗眼中的“底层”人民，也应该去***积极得思考如何让自己幸福，而不是在焦虑和痛苦、愤怒和抱怨中过完自己的半生。***

应该让他养成这样的思维习惯——***去追逐，在追逐中能获得快乐，而不是去摆脱，摆脱中会让他痛苦。***

即便从表面上来看，两种思维习惯所做的决策和现实结果都是一样的，但我相信对本人来说，是两种不同的体验。

**学习如此，生活如此，我希望未来每一个人都能获得幸福的能力，都能摆脱物质枷锁，成为一个奔跑的人，而非逃跑的人。**</content:encoded></item><item><title>数据人的求职心法：在迷茫中找到方向</title><link>https://blog.rockythink.work/blog/数据人的求职心法在迷茫中找到方向</link><guid isPermaLink="true">https://blog.rockythink.work/blog/数据人的求职心法在迷茫中找到方向</guid><description>把自己当做一家公司来运营——重新定义数据人的求职之路</description><pubDate>Wed, 22 Jan 2025 00:00:00 GMT</pubDate><content:encoded>失业了，或者投了几十份简历都石沉大海？

先停下来想一个问题：**如果你是一家公司，你会怎么做？**

作为一个在数据领域工作了10年的从业者，前阿里数据架构专家，我想分享一个核心观点：**把自己当做一家公司来运营**。这个思维模式的转变，会让你的求职之路完全不同。

## 为什么要把自己当做一家公司？

在大厂工作多年后，我深刻意识到一个事实：**在公司眼里，我们本质上就是一个供应商。**

既然如此，为什么不干脆把自己当成一家公司来运营？

这个思维转变带来的好处是：

1. **心态更平和**：公司终止合作很正常，不是人格否定
2. **定位更清晰**：我提供什么服务？我的核心竞争力是什么？
3. **决策更理性**：这个&quot;客户&quot;值得长期合作吗？投入产出比如何？

从今天开始，你就是&quot;XX数据咨询有限公司&quot;的CEO。

## 重新定义求职流程：从乙方思维到平等合作

### 1. 简历不是简历，是你的Service Proposal

我见过太多数据人的简历，密密麻麻写满了&quot;熟练使用SQL&quot;、&quot;精通Python&quot;。说实话，2025年了，这些已经是数据岗的标配，不是你的差异化优势。

**真正的简历应该像咨询公司的提案：**

**Before（大部分人的写法）：**

```
工作经历：XX公司 数据分析师 2020-2023
- 负责日常数据提取和报表制作
- 使用Python进行数据清洗和分析
- 参与公司数据仓库建设
```

**After（公司化思维的写法）：**

```
项目案例：电商用户增长数据体系搭建
客户背景：某B轮电商公司，DAU 50万，面临增长瓶颈
解决方案：
- 构建用户生命周期价值模型，识别高价值用户特征
- 设计A/B测试框架，3个月内完成15个增长实验
- 建立自动化营销效果监控体系，实时追踪ROI
项目成果：
- 新用户次月留存率从23%提升至31%
- 获客成本降低35%，LTV/CAC从1.2提升至2.1
- 为公司C轮融资提供核心数据支撑
```

看到区别了吗？前者是在描述你做了什么，后者是在展示你创造了什么价值。

**写简历的核心原则：**

1. **量化一切可以量化的成果**（提升了多少？节省了多少？）
2. **突出业务影响力**（你的分析如何改变了决策？）
3. **展示解决问题的能力**（遇到什么挑战？如何解决的？）

### 2. 面试是商务洽谈，不是单向审核

面试时，要记住这是一个双向选择的过程。你不是去乞求一份工作，而是去洽谈一个合作机会。

**商务洽谈式面试的要点：**

**开场定调：**
&quot;很高兴有机会了解贵公司的数据团队。我看到JD中提到需要建设用户画像体系，这正好是我的专长领域。能先了解一下你们目前的数据基础设施情况吗？&quot;

**展示专业度：**

- 不要只回答问题，要引导对话
- 适时反问，了解团队现状和痛点
- 分享你的方法论，而不只是经验

**价值交换：**
&quot;基于刚才的讨论，我认为贵公司目前最需要的是建立数据驱动的文化，而不仅仅是招一个写SQL的人。我可以分享一下在大型组织中推动数据文化转型的一些经验...&quot;

**面试中的关键提问：**

1. 数据团队的汇报线是什么？（判断数据部门的话语权）
2. 公司对数据的定位是什么？成本中心还是价值中心？
3. 目前最大的数据痛点是什么？之前是怎么解决的？
4. 这个岗位的前任为什么离开？（了解坑点）
5. 入职后的30/60/90天，你期望看到什么成果？

### 3. 求职是BD过程，需要销售漏斗思维

很多人投了10份简历没回应就开始怀疑人生。但从销售漏斗的角度看，这完全正常。

**典型的求职漏斗：**

```
简历投递：100份
├── 获得HR面试：15-20个（15-20%）
    ├── 进入技术面：10-12个（60-70%）
        ├── 进入终面：5-6个（50%）
            └── 获得Offer：2-3个（40-50%）
                └── 接受Offer：1个
```

**关键转化率提升技巧：**

**简历投递→HR面试（目标20%+）：**

- 不要海投，每份简历都要定制化
- 优先内推渠道（转化率可达40%+）
- 简历关键词要匹配JD（过ATS系统）
- 选择合适的投递时间（周二到周四上午）

**HR面试→技术面（目标70%+）：**

- 准备好&quot;自我介绍&quot;的多个版本（30秒/2分钟/5分钟）
- 了解公司业务，能说出他们的核心指标
- 薪资期望给区间，不要给死数

**技术面→终面（目标60%+）：**

- 准备2-3个完整的项目案例，能讲清楚来龙去脉
- 展示你的思考框架，不只是技术细节
- 适当展示软技能（跨部门协作、向上管理等）

## 经营策略：在存量市场中打造差异化

### 1. 产品矩阵：不要做全栈，要做T型人才

数据行业已经从增量市场进入存量市场。现在，你必须有自己的护城河。

**技能发展建议：**

**基础技能（横向）：**

- SQL数据提取和分析
- Python/R数据处理
- 统计学和机器学习基础
- 数据可视化能力

**专业深度（纵向）：**

选择一个垂直领域深耕，成为该领域的数据专家：

- **电商**：用户生命周期、推荐系统、供应链优化
- **金融**：风控模型、量化策略、合规分析
- **内容**：推荐算法、内容理解、创作者经济
- **游戏**：用户行为、经济系统、付费预测
- **医疗**：临床数据分析、医保控费、精准医疗

**前沿技能（差异化）：**

- AI/LLM在数据分析中的应用
- 数据产品设计能力
- 数据战略规划能力
- 商业洞察和storytelling能力

### 2. 品牌建设：让机会主动找你

建立个人品牌是长期投资，但回报巨大。

**内容输出策略：**

**技术博客：**

- 写你的实战经验，而不是基础教程
- 分享踩坑经历和解决方案
- 展示你的思考过程和方法论

**开源项目：**

- 发布完整的分析框架或工具
- README要写清楚使用场景和价值
- 持续维护和更新

**社交媒体：**

- LinkedIn保持活跃，分享行业洞察
- 参与专业社群讨论
- 建立并维护行业人脉

### 3. 风险管理：为不确定性做准备

作为一家&quot;公司&quot;，你需要管理风险。

**财务缓冲：**

- 保持6个月的生活费储备
- 建立多元收入来源（咨询、培训、项目）
- 控制固定开支，保持财务灵活性

**技能更新：**

- 每季度评估市场需求变化
- 保持学习，跟上技术趋势
- 建立技能组合，而非单一技能

**人脉维护：**

- 定期联系前同事和行业朋友
- 参加行业活动和meetup
- 在别人需要时提供帮助

## 实战指南：立即可以采取的行动

### Week 1-2：战略定位

**任务清单：**

- [ ] 做一个SWOT分析：你的优势、劣势、机会、威胁
- [ ] 研究目标行业和公司：他们需要什么样的数据人才？
- [ ] 确定你的定位：你是什么类型的&quot;数据公司&quot;？

**具体行动：**

1. 列出你最有成就感的3个项目
2. 分析这些项目的共同点
3. 提炼你的核心价值主张

### Week 3-4：产品打造

**任务清单：**

- [ ] 重写简历：从罗列经历到展示价值
- [ ] 准备案例：整理3个能详细讲述的项目
- [ ] 更新作品集：GitHub、个人网站、技术博客

**简历优化要点：**

1. 开头用2-3句话概括你的核心价值
2. 用STAR法则描述项目经历
3. 所有成果必须量化

### Week 5+：市场推广

**任务清单：**

- [ ] 建立求职追踪表格：公司、岗位、进度、反馈
- [ ] 每天定制化投递3-5份简历
- [ ] 每周参加至少1个行业活动
- [ ] 保持内容输出：每周1篇文章或1个项目更新

**执行要点：**

1. 质量优于数量
2. 跟踪并分析转化率
3. 根据反馈持续优化

## 心态建设：像CEO一样思考

### 1. 接受市场反馈

被拒绝不是失败，是市场在告诉你：

- 你的&quot;产品&quot;可能需要调整
- 你的&quot;定位&quot;可能不够精准
- 这个&quot;客户&quot;可能不是你的目标客户

每次面试后，无论结果如何，都要复盘：

- 哪些问题答得好？哪些需要改进？
- 面试官关心什么？公司真正需要什么？
- 这个机会真的适合我吗？

### 2. 保持专业形象

即使内心焦虑，也要保持专业：

- 所有邮件往来保持礼貌专业
- 面试准时、着装得体
- 及时follow up，表达感谢
- 即使被拒，也优雅退场

### 3. 长期主义视角

记住，你在经营一家公司，不是在找一份临时工作：

- 选择&quot;客户&quot;要慎重
- 建立长期合作关系
- 持续提升服务质量
- 关注口碑和推荐

## 2025年数据领域的机会

基于行业观察，以下方向值得重点关注：

### 1. AI+数据分析

- 利用LLM提升分析效率
- 帮助业务团队应用AI工具
- 构建AI驱动的数据产品

### 2. 数据资产化

- 数据价值评估和变现
- 数据产品设计和运营
- 数据交易和合规

### 3. 实时数据分析

- 流式数据处理
- 实时决策系统
- 边缘计算场景

### 4. 数据安全和隐私

- 隐私计算应用
- 数据合规体系建设
- 安全多方计算

## 最后的话

把自己当做一家公司来运营，不是要你变得冷血或功利，而是要你：

- 更理性地看待职业选择
- 更主动地管理职业发展
- 更平和地面对市场变化

记住：**你不是在找工作，你是在寻找一个能够共同创造价值的合作伙伴。**

市场永远需要能创造价值的人。而作为数据人，我们的核心价值是：**帮助企业在数据中发现洞察，在不确定中找到确定。**

现在，开始经营你的&quot;数据咨询公司&quot;吧。相信自己的价值，保持学习和成长，机会一定会来的。

## 延伸学习

如果你想系统性地提升数据技能，建议你了解一下我创建的 **[拾穗数据](https://pro.ss-data.cc?utm_source=blog&amp;utm_campaign=job_guide)** 知识库。

基于10年的数据领域经验，我在其中整理了：

- 完整的数据技能学习路径（从零基础到专家）
- 真实的职业发展规划和薪资预期
- 数据人求职的实战策略和案例分析
- 让学习变得有温度有深度的内容体系

让数据学习不再孤单，让职业发展更有方向。

祝你早日找到理想的合作伙伴！</content:encoded></item><item><title>数据湖与数据仓库：两种核心数据存储方式的深度解析与差异</title><link>https://blog.rockythink.work/blog/数据湖与数据仓库两种核心数据存储方式的深度解析与差异</link><guid isPermaLink="true">https://blog.rockythink.work/blog/数据湖与数据仓库两种核心数据存储方式的深度解析与差异</guid><description>最近有一些朋友在问我，数据湖和数据仓库有什么区别和关系，一开始我是觉得这个事情压根不需要一篇博客来解释，昨天又有人在问，我想了下，还是话点时间来解释下</description><pubDate>Fri, 20 Sep 2024 00:00:00 GMT</pubDate><content:encoded>#### 引言
在现代数据管理体系中，**数据湖**和**数据仓库**是企业存储和处理数据的两大主要方式。随着大数据应用的普及，企业面临着从各种数据源中获取并利用数据的挑战。尽管数据湖和数据仓库都有助于这一过程，但它们的设计理念和应用场景截然不同。本篇博客将深入探讨这两种数据存储技术的概念、特点及其差异，帮助你选择适合自己业务需求的解决方案。

---

#### 一、什么是数据湖？

**数据湖**（Data Lake）是一个能够存储大量原始数据的存储系统，不论是结构化的、半结构化的，还是非结构化的数据都可以存放其中。其关键特点在于：数据通常以原始格式存储，直到需要进行处理或分析时才进行转换。常见的数据湖架构依赖于分布式存储系统，如 Amazon S3、HDFS 或阿里云的 OSS，支持海量数据存储。

- **存储灵活性**：可以存储任何类型的文件和数据，不受格式限制。
- **低成本存储**：由于没有对数据进行预处理，数据湖在存储成本上具有较大的优势。
- **适用场景**：适用于存储传感器数据、日志、图像、音视频等非结构化数据，以及需要未来处理或分析的海量数据。

#### 二、什么是数据仓库？

**数据仓库**（Data Warehouse）是一种存储结构化和经过优化处理数据的系统，专门为业务分析和决策提供支持。数据仓库的关键在于：数据在被存储之前需要经过 ETL（Extract, Transform, Load）过程，以确保数据一致性、可靠性和高性能。企业常使用数据仓库来进行历史数据分析、报表生成和商业智能（BI）分析。

- **结构化数据存储**：只存储经过处理和转换的结构化数据，通常来自业务系统。
- **高效查询性能**：由于数据已经过优化和建模，数据仓库能够提供快速、可靠的查询性能，适用于分析报告生成和复杂查询。
- **适用场景**：适用于财务分析、销售报表、关键指标追踪等业务场景。

#### 三、数据湖与数据仓库的关键差异

尽管两者都涉及到数据存储与管理，但在数据处理方式、应用场景和存储结构上存在显著差异。

##### 1. **数据类型**
- **数据湖**：支持存储结构化、半结构化、非结构化数据（如 CSV、JSON、音频、视频、图片等）。数据存储在其原始形式，不需要预先定义模式。
- **数据仓库**：只存储结构化数据，数据需要在导入之前进行转换和清洗。所有数据必须符合预定义的模式。

##### 2. **存储成本**
- **数据湖**：由于数据湖不需要对数据进行预处理，因此其存储成本较低。基于云的对象存储系统如 Amazon S3 或阿里云 OSS，按需付费的存储方式使得数据湖成为存储大量非结构化数据的经济选择。
- **数据仓库**：由于数据需要先进行 ETL 处理和优化，存储成本通常高于数据湖。此外，数据仓库通常需要昂贵的计算资源来支持复杂的查询和分析任务。

##### 3. **数据处理和架构复杂度**
- **数据湖**：数据处理是延迟的，数据直到实际使用时才会被清理、转换或优化。这种“先存储，后处理”的模式使得数据湖适用于大数据分析、机器学习等场景，数据架构较为灵活。
- **数据仓库**：数据在进入仓库之前需要完成转换和建模，因此整个架构和数据处理流程更加复杂，但保证了数据的一致性和准确性。这种“先处理，后存储”的模式使得数据仓库非常适合用于生成标准化报表或进行快速的业务查询。

##### 4. **用户群体**
- **数据湖**：更多面向数据科学家、分析师以及机器学习工程师，这些用户擅长处理原始数据、开发模型、探索性数据分析。
- **数据仓库**：主要服务于业务分析师和管理人员，支持他们快速获取标准化、结构化的商业数据，用于生成报表和进行决策支持。

##### 5. **使用场景**
- **数据湖**：适用于需要处理多种类型和格式的原始数据的场景，如机器学习、实时分析、物联网（IoT）数据处理。
- **数据仓库**：适用于固定格式的业务分析场景，如企业级报表、历史数据分析等。

#### 四、数据湖与数据仓库的融合趋势

尽管数据湖和数据仓库有明显的差异，近年来我们可以看到两者逐渐融合的趋势。出现了像 **湖仓一体（Data Lakehouse）** 这样的架构，它结合了数据湖和数据仓库的优点。湖仓一体能够同时处理结构化和非结构化数据，允许数据科学家与分析师在同一个平台上工作，减少数据孤岛问题。

##### 1. **湖仓一体架构的优势**
   - 既能处理非结构化数据，也能高效查询结构化数据。
   - 提供实时分析和历史分析的整合，帮助企业实现更多元化的数据使用场景。

##### 2. **使用案例**
   - 一些领先的云计算服务提供商如阿里云 MaxCompute、Google BigQuery 都在尝试支持数据湖和数据仓库功能的集成，帮助企业在降低成本的同时提高数据分析能力。

#### 五、如何选择合适的存储方式？

在选择数据湖还是数据仓库时，企业需要根据其数据需求、分析复杂度、性能要求等多方面进行权衡。简单来说：
- 如果你的企业需要存储多种格式的海量数据，并且想要在未来通过机器学习或探索性分析进行深入挖掘，那么数据湖是一个不错的选择。
- 如果你的企业主要需要结构化数据来进行快速的业务分析、报表生成等，数据仓库将更适合你的需求。

#### 结论

总而言之，在传统的数据架构中，数据湖作为数据仓库的上游。

还是拿我经常提的开餐厅做饭来举例子，数据湖就像是鱼塘，数据就是鱼或者里面的各种食物，而数据仓库就是按照需求把这些鱼打捞上来，简单加工好并按照设定的方案存储起来。

从数据应用的角度来看，仓库中的食物质量会更加可靠，因为他们是一套标准化来的东西，而数据湖中的数据就不同了，他可能需要大量的时间来进行清洗和转化，最后才能用与分析等。。。

数据湖和数据仓库代表了两种不同的数据存储方式，各自有其独特的优势和应用场景。理解它们的差异并结合业务需求选择合适的存储方式，将帮助企业在数据驱动的世界中更好地应对挑战。随着技术的进步，数据湖和数据仓库的界限可能会变得更加模糊，混合架构的未来已经在逐步成形。


See You!</content:encoded></item><item><title>是的，我换网站主题了，聊聊我现在对博客的新理解</title><link>https://blog.rockythink.work/blog/是的我换网站主题了聊聊我现在对博客的新理解</link><guid isPermaLink="true">https://blog.rockythink.work/blog/是的我换网站主题了聊聊我现在对博客的新理解</guid><description>好久不见，我似乎近半年都没有更新博客了，非常抱歉，让有些朋友们担心了，什么原因呢？这半年我在规划做一件事情，就是整理一下自己的知识库，把之前学习到的，经历过的，都整理成文，10年的社会经验，内容非常多，所以很麻烦，走了不少的冤枉路，才最终定下了方案，把自己沉淀知识的地方确定下来了，正在迁移中。</description><pubDate>Mon, 24 Mar 2025 00:00:00 GMT</pubDate><content:encoded>**hello，小伙伴们**

好久不见，我似乎近半年都没有更新博客了，非常抱歉，让有些朋友们担心了，什么原因呢？这半年我在规划做一件事情，就是整理一下自己的知识库，把之前学习到的，经历过的，都整理成文，10年的社会经验，内容非常多，所以很麻烦，走了不少的冤枉路，才最终定下了方案，把自己沉淀知识的地方确定下来了，正在迁移中。

下面开始我的汇报工作：

### 汇报

首先呢，我现在写作的主要工具是Obsidian，我考虑过用Notion，但确实有点复杂，似乎学习成本过高了点，当然我肯定相信他是最好的笔记软件，功能一定非常齐全，但从我目前的需求来看，我只要有一个可以完整支持Markdown的笔记工具，本地文件，我不太喜欢把数据放在云上，我是这么想的，如果是海外的网站，其实连接的稳定性就是个问题，虽然我这边是长期使用Surge的，但毕竟还是会有不稳定的风险，我担心未来某些原因，我再也找不到我的数据了，所以海外的还是不太放心，那么选择国内的笔记软件如何呢？我觉得在国内的任何平台发表任何内容，都是非常别扭的，因为无形中我们都在接受监管，我虽然并不会发布任何违法的内容，但很不喜欢被人“看”着。

所以唯一的方案就是本地，所以我选择的方案是Obsidian，我其实也买了Mweb Pro 和 effie（本地和云端都有），但Obsidian的灵活性和可扩展性以及可迁移性真的吸引我了，自己的数据自己可以完全掌控，我用群晖的drive来同步我重要的数据，包括我的笔记和文章。

在功能上，我需要的是一个All in One 的产品，至少可以承接我大部分的工作流，不用在不同的终端之间来回切换。

那么就衍生到了，我的工作流是什么。

首先知识的整理就不多说了，慢慢整理，慢慢码字。

#### 我想做自媒体

哈哈，我之前从来没有想过自己会做自媒体，但的确是没有选择的选择，现在的这个环境下，找到安全感的方式就是积累和复利，找个工作已经不能让我有安全感了，AI风暴下，也许过几年大家都会受影响，不然是失业还是降薪，这是没有办法的事情，毕竟AI会更便宜，而内需并没有增加。那么与其过几年焦虑的日子，还不如把上班的事情放下来 ，做可以有积累的事情，

**我目前的想法有这么几个：

- 把大数据的经验分享出来，帮助想做大数据的人，积累用户，并有偿提供更多服务，目前是我的主要方向；
	- 主要内容的发布渠道有三个：
		- 微信公众号引流和沉淀用户；
		- 语雀提供体系化知识服务；
		- Wordpress网站提供外部流量入口，使用关注微信公众号才能查看文章或下载资源等方式，引入微信；
		- 知乎、简书、掘金同步微信公众号的内容。
	- 所以内容有两套，之前会有重叠：
		- 免费内容：紧跟时势，表达观点，树立人设，打打广告
		- 付费内容：知识体系，全干货
- 自己一边做独立开发，一边分享独立开发的相关经验，这个缓慢进行；
	- 学习一下MCP，用python开发一些所谓的AI agent，面向的还是数据开发或者数据运营，这算是独立开发的一个子项吧，这个项目呢，可能要toB，但我一个人很难toB。先做了再说

### 那么这个博客……
我换了主题，和之前的差不多，但这是一个国人开发的主题，具体可以看博客的页脚，上次的主题我就是为了适配中文费了很大功夫去调整，这次我直接用国人开发的，我想应该会更加可靠一些。

顺便，我也换了托管平台，从之前的cloudflare换成了vercel，我才发现vercel比cloudflare在静态网站托管方面要好用很多，cloudflare过于简单了，如果没有试过vercel的可以试试。

### 最后一件事情

我决定放弃在新的博客中使用评论功能，这个问题我纠结了很久，没有评论我如何和我的读者沟通呢？我想我直接把自己的微信放出来吧，或者你们可以通过邮件来跟我沟通，一旦达成连接的老朋友，我们可以通过任何方式来进行沟通交流，新的朋友呢，加微信或者发邮件都可！

好啦，随便写写，多写写提升一下自己的写作水平，感谢你们能够忍受我糟糕的文笔。

回头见！</content:encoded></item><item><title>离线数据中台的数据安全策略实践</title><link>https://blog.rockythink.work/blog/离线数据中台的数据安全策略实践</link><guid isPermaLink="true">https://blog.rockythink.work/blog/离线数据中台的数据安全策略实践</guid><description>在数字化时代，数据成为了企业的核心资产，而如何保障这些资产的安全成为了亟待解决的问题。离线数据中台，作为企业数据资产管理的重要环节，其数据安全策略的实践显得尤为重要。今天，我们就来聊聊这个话题，知其然，更要知其所以然。</description><pubDate>Sat, 07 Sep 2024 00:00:00 GMT</pubDate><content:encoded>在数字化时代，数据成为了企业的核心资产，而如何保障这些资产的安全成为了亟待解决的问题。离线数据中台，作为企业数据资产管理的重要环节，其数据安全策略的实践显得尤为重要。今天，我们就来聊聊这个话题，知其然，更要知其所以然。

首先，我们要明白什么是离线数据中台。离线数据中台是企业数据架构的一部分，其主要功能是对分散在各个业务系统中的数据进行整合、处理和存储，为数据分析和决策提供支持。既然涉及到数据的整合和存储，那么数据安全自然成为了关注的焦点。

那么，离线数据中台的数据安全策略该如何实践呢？以下是我的一些见解。

一、数据加密：防患未然

数据加密是保障数据安全的基础手段。在离线数据中台中，数据加密可以分为传输加密和存储加密。

1. 传输加密：数据在传输过程中容易遭受黑客攻击，因此，采用SSL/TLS等加密协议对数据进行传输加密，可以有效防止数据泄露。

2. 存储加密：数据存储在离线数据中台中，同样面临安全风险。通过对数据进行存储加密，即使数据被非法获取，也无法解析出真实信息。

二、权限控制：精准管理

权限控制是确保数据安全的关键环节。在离线数据中台中，权限控制应遵循以下原则：

1. 最小权限原则：为用户分配最小必要的权限，避免过度授权。

2. 分级管理原则：根据用户角色和业务需求，对数据进行分级管理，确保敏感数据只有授权人员才能访问。

3. 动态调整原则：根据用户行为和业务变化，动态调整权限，降低数据安全风险。

三、审计与监控：及时发现异常

审计与监控是保障数据安全的第三道防线。在离线数据中台中，应实施以下措施：

1. 数据审计：对数据访问、修改、删除等操作进行详细记录，以便事后审计和问题追踪。

2. 行为监控：通过大数据分析技术，对用户行为进行实时监控，发现异常行为及时报警。

3. 威胁情报：与外部安全机构合作，获取最新的安全威胁情报，提升数据安全防护能力。

四、数据脱敏：隐私保护

数据脱敏是保障用户隐私的重要手段。在离线数据中台中，应对以下数据进行脱敏处理：

1. 个人敏感信息：如姓名、电话、地址等，采用脱敏算法进行加密处理。

2. 业务敏感数据：如交易金额、密码等，通过数据脱敏降低泄露风险。

五、安全意识培训：以人为本

人是数据安全的关键因素。企业应加强以下方面的安全意识培训：

1. 员工安全意识：提高员工对数据安全的重视程度，防止内部泄露。

2. 合规意识：让员工了解国家法律法规和公司政策，避免违规操作。

3. 应急处理能力：培训员工掌握数据安全事件的处理流程，降低事故损失。

总之，离线数据中台的数据安全策略实践需要多管齐下，综合运用技术手段和管理措施。只有这样，我们才能真正做到知其然，知其所以然，为企业数据资产安全保驾护航。同时，我们也要时刻关注数据安全领域的最新动态，不断创新和优化安全策略，为我国数字化发展贡献力量。综上所述，离线数据中台的数据安全策略实践不仅需要技术支撑，更依赖于全员的安全意识和管理水平。在未来的发展中，我们将持续关注数据安全技术的创新和法规政策的完善，确保离线数据中台的稳固防护，助力企业稳健迈步在数字化的征途上。</content:encoded></item><item><title>聊一下我现在的写作工作流吧</title><link>https://blog.rockythink.work/blog/聊一下我现在的写作工作流吧</link><guid isPermaLink="true">https://blog.rockythink.work/blog/聊一下我现在的写作工作流吧</guid><description>这段时间不是决定了把写作当作自己未来的长期*事业*了嘛，所以一个通畅的写作工作流是一个非常重要的事情，他可以维持我坚持下去，因为习惯应该就是一个固定模式的事情，工作流的意义就是把这个模式稳定下来，不用每次都去想如何去做，专注于写作的内容上就好了。</description><pubDate>Tue, 25 Mar 2025 00:00:00 GMT</pubDate><content:encoded>这段时间不是决定了把写作当作自己未来的长期*事业*了嘛，所以一个通畅的写作工作流是一个非常重要的事情，他可以维持我坚持下去，因为习惯应该就是一个固定模式的事情，工作流的意义就是把这个模式稳定下来，不用每次都去想如何去做，专注于写作的内容上就好了。

先说笔记软件吧，我当前用的主要写作软件是*Obsidian*，他几乎承载了我所有的写作工作，当然也几乎满足了我对写作软件的所有需求。

这里我不对软件本身多做阐述，没有用过的可以直接上手了解一下。

我的写作分成四个部分内容：

1. **博客** （对外）：这是我胡说八道的地方，我在这里无话不谈
2. **个人知识库** （私密）：可以理解成笔记，但我想让这个笔记更加结构化，方便日后管理和回顾
3. **知识付费内容** （对外）：我会从个人知识库中，以及过去的经验中，把我在所在行业（大数据）的一些经验和心得整理成体系化的内容，用来帮助他人
4. **公众号**（对外）：这个是用来引流的，把用户引到公众号或者群里

博客: [RockyThink](https://blog.rockythink.work)

个人知识库：Obsidian

知识付费内容：[语雀](https://www.yuque.com/rockythink/) 、[知识星球](https://zsxq.com) 

公众号：
![image.png](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/safe_image/20250325104358581.webp)


这四块内容相当于四条生产线，但这四条生产线并不是独立运行的。他们的逻辑应该是这样的：

![image.png](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/safe_image/20250325110922302.webp)

感觉任务繁重啊，不过幸好有AI帮忙，可能并不会像想象中的那么难。

在建立好这样的路径后，我从今天开始就用这种方式来进行了。

所以，加油吧！

希望可以真正发挥自己的价值。</content:encoded></item><item><title>面对网络“公知”的胡言乱语：如何保持清醒？</title><link>https://blog.rockythink.work/blog/面对网络公知的胡言乱语如何保持清醒</link><guid isPermaLink="true">https://blog.rockythink.work/blog/面对网络公知的胡言乱语如何保持清醒</guid><description>在自媒体时代，人人都能轻松发声，导致了大量缺乏逻辑、为流量制造噱头的言论充斥网络，严重影响普通人的情绪和认知。本文探讨了这种现象背后的根源，分析了信息不对称和情绪操控的常见手段，并提出了几种应对策略：保持理性、独立思考、批判性看待信息来源，保护自己的认知边界，避免成为虚假言论的情绪俘虏。</description><pubDate>Wed, 23 Oct 2024 00:00:00 GMT</pubDate><content:encoded>## **1. 网络言论的现状：人人皆有发声权，言论门槛极低**

在如今的自媒体时代，每个人都可以通过简单的设备和工具发布自己的想法，无论是微博、微信公众号、抖音，还是B站、快手等平台，都让人们能够迅速将自己的观点传播出去。技术门槛的降低让言论发布变得异常容易，这在某种程度上确实推动了言论自由。然而，这种自由的背后也隐藏着不少问题。

首先，我们可以看到，网络上的言论已经不再是为了分享真实的感受或者信息，很多时候是为了博取流量和眼球。为了吸引注意力，一些人会选择夸大事实，甚至是完全捏造，以获取更多的点击和关注。这种“标题党”式的操作非常普遍，因为在现如今的流量经济下，流量就意味着金钱和利益。因此，我们看到的很多文章、视频，其实只是为了一时的热度，而内容的真实性和逻辑性已经被抛在了脑后。

这些所谓的“公知”和自媒体人，往往会站在一个“正经”的姿态上，发表看似有理有据的言论，但实际上这些内容要么缺乏基本的事实依据，要么是用错误的逻辑得出的结论。这种现象广泛存在于各个领域——从社会时政到科技产品测评，再到养生、教育等各类话题。更有甚者，很多人故意歪曲事实，传播虚假信息，导致大量网民被误导。

网络上的“公知”往往打着所谓的“专业”旗号，用他们自认为正确的逻辑发表观点。令人惊讶的是，只要这些言论看起来“正经”，便会有大批人相信。这种现象可以用一句话概括：**一本正经的胡说八道，人们只在乎一本正经，只要是一本正经的，就会有很多人相信。**

## **2. 言论的负面影响：情绪和认知的双重伤害**

在这样的网络环境中，普通人受到的影响是显而易见的。首先，许多信息看似真实，但实际上是片面的甚至是错误的，这些内容会在不知不觉中影响我们的判断。当我们每天刷微博、刷视频，看到那些充满情绪化、煽动性言论的帖子，情绪也会被无形中牵引。渐渐地，我们可能会陷入某种情绪漩涡，变得焦虑、愤怒，甚至失去对现实的客观看法。

其次，这种混乱的信息环境会逐渐侵蚀我们的智商。因为我们习惯于被喂养各种观点和结论，久而久之，我们就失去了独立思考和逻辑推理的能力。很多人不再愿意花时间去验证信息的真伪，而是选择相信那些表面上看起来“靠谱”的言论。这样的心态和行为很容易导致我们陷入信息茧房，不断接触到同样的片面信息，从而被进一步洗脑和误导。

很多以流量为导向的“公知”和自媒体人，知道如何利用大众的情绪，他们会故意夸大问题的严重性，或者提出看似惊世骇俗的结论，从而引发讨论和传播。而这些言论却往往缺乏事实依据和逻辑支持，仅仅是为了激发大家的情绪。这种“情绪操控”让很多人陷入对社会、对生活的错误认知中，甚至影响他们的生活态度和决策。

## **3. 我们该如何应对？**

面对这种情况，我们不能任由自己被这些虚假或情绪化的言论所牵着走。相反，我们需要主动采取措施，培养自己对信息的辨别力和批判性思维，保护好自己的情绪和认知。

**（1）保持理性，避免被情绪操控**

面对那些看似耸人听闻、煽动性极强的言论时，我们要做的第一件事就是保持冷静，不被表面上的情绪所感染。很多自媒体人利用的正是大众的情绪弱点，试图通过制造冲突和对立来吸引关注。如果我们被这些情绪左右，那么我们就已经掉入了他们的陷阱。因此，面对类似内容时，我们要首先问自己：这背后有什么动机？是否真的有事实依据？这样可以避免被误导。

**（2）独立思考，依靠逻辑做判断**

我们要学会用逻辑来分析问题，而不是盲从任何看似“权威”的观点。无论是谁发表的言论，我们都应该保持质疑的态度。一个非常有效的方法就是不断追问：这个结论是如何得出的？是否有事实支持？数据来源是否可靠？多问几个“为什么”，我们就能看清很多言论背后的空洞和荒谬。

**（3）培养批判性思维，多方获取信息**

不要局限于单一的信息来源，而要尽量多看多听，了解不同的声音。特别是当我们看到一个极端的观点时，最好去找找反方的意见，看看他们如何反驳。通过对比不同的观点和论据，我们可以更全面地理解问题，而不是被单方面的信息左右。批判性思维是我们在信息时代最重要的武器，帮助我们从纷杂的信息中找出真相。

**（4）保护自己的情绪和认知边界**

面对信息爆炸的环境，选择性忽略一些无关紧要的、充满情绪化的内容，是一种有效的自我保护。不要让所有信息都进入你的脑海，学会过滤无用的信息。设立自己的“信息过滤器”，只关注那些对自己有价值的内容，可以有效减少网络上的“噪音”，让我们保持清醒的头脑。

**（5）保持学习，提升自我认知**

最后也是最重要的一点，我们要不断提升自己的知识水平和认知能力。只有我们自身具备足够的知识储备，才能更好地应对各种信息的冲击。多读书、多学习，保持对世界的好奇心，才能在面对复杂多变的环境时，做出更有依据的判断，而不是被虚假的信息牵着鼻子走。

## **4. 结语：做一个理性的思考者，而不是情绪的俘虏**

在这个人人皆可发声的自媒体时代，信息的质量良莠不齐，真假难辨。我们无法阻止虚假信息的传播，但我们可以选择做一个理性的思考者，而不是情绪的俘虏。**一本正经的胡说八道**，看似有理有据，实际上只是流量经济下的产物。只有学会独立思考，依靠逻辑和事实做判断，才能在信息海洋中保持清醒，不让虚假和夸大的言论影响我们的生活和认知。</content:encoded></item><item><title>如何在Astro Markdown博客中插入视频，让其自适应页面大小</title><link>https://blog.rockythink.work/blog/如何在astro-markdown博客中插入视频让其自适应页面大小</link><guid isPermaLink="true">https://blog.rockythink.work/blog/如何在astro-markdown博客中插入视频让其自适应页面大小</guid><description>最近在博客中插入了一个youtube视频，pc端看起来似乎很正常，只是页面不是很居中，想想也不是大事情，就无所谓了，直到我前两天用手机打开博客，发现这个视频把我整个页面给撑起来了。根本无法看，所以简单研究了一下，自适应视频的宽度，达到页面的美观（非前端出身，大佬求放过）</description><pubDate>Wed, 17 Jul 2024 00:00:00 GMT</pubDate><content:encoded>最近在博客中插入了一个youtube视频，pc端看起来似乎很正常，只是页面不是很居中，想想也不是大事情，就无所谓了，直到我前两天用手机打开博客，发现这个视频把我整个页面给撑起来了。根本无法看，所以简单研究了一下，自适应视频的宽度，达到页面的美观（非前端出身，大佬求放过）

## 一开始我直接在Markdown中插入了youtube给的代码
如下：
```html
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/t4vSzN2QDrE?si=Gx4nHrPwVaqasoud&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;/iframe&gt;
```

在我现在的astropaper这个模板中的效果是这样的

pc端：

![20240717024350](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240717024350.png)

感觉还行，但是到了移动端就不一样了：

![20240717024443](https://rockythink-blog.oss-cn-shanghai.aliyuncs.com/post-image/20240717024443.png)

哈哈，youtube给的代码中，把iframe 的size写死了，所以导致了当页面宽度不够的时候，出现这个问题。

我研究一下后，给出了一个我比较满意的解决方案

## 解决方案

```html
&lt;div style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; height: auto;&quot;&gt;
&lt;iframe style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot; src=&quot;https://www.youtube.com/embed/[这里替换成视频的id，在视频的URL中可以找到]&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
```
效果如下

&lt;div style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; height: auto;&quot;&gt;
&lt;iframe style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot; src=&quot;https://www.youtube.com/embed/t4vSzN2QDrE&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

即解决了问题，视频和文字对齐，看起来也美观了很多。

### 解释一下这个代码：

* \&lt;div\&gt; 元素设置了一个相对位置和一个 16:9 的宽高比（56.25% = 9/16），从而使其内容自适应。

* \&lt;iframe\&gt; 元素则使用绝对定位，并将宽度和高度设置为 100%，从而填满 \&lt;div\&gt; 的空间。


这种方式可以确保视频在不同大小的屏幕上都能自适应显示。

这个模板其他平台也是有效的，如bilibili：

我随便找了个视频，大家看一下，只是把src改成了b站嵌入代码中的src，如下：

&lt;div style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; height: auto;&quot;&gt;
&lt;iframe style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot; src=&quot;https://player.bilibili.com/player.html?isOutside=true&amp;aid=1456243802&amp;bvid=BV18i421h7GR&amp;cid=1602874468&amp;p=1&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

希望能对你有所帮助。

See you！</content:encoded></item><item><title>为什么我要创建一个有温度的数据学习平台</title><link>https://blog.rockythink.work/blog/为什么我要创建一个有温度的数据学习平台</link><guid isPermaLink="true">https://blog.rockythink.work/blog/为什么我要创建一个有温度的数据学习平台</guid><description>从阿里数据专家到知识分享者，我想创建一个不一样的数据学习体验</description><pubDate>Wed, 23 Jul 2025 00:00:00 GMT</pubDate><content:encoded>离开阿里已经一年多了，期间经历了很多思考和探索。最近，我做了一个决定：创建一个有温度的数据学习平台——**拾穗数据**。

今天想和大家分享一下这个决定背后的思考。

## 一个困扰我的问题

在阿里工作的这些年，我接触了很多想要转行数据分析的朋友。他们的困扰出奇的一致：

**&quot;网上的教程那么多，为什么我还是学不会？&quot;**

这个问题困扰了我很久。明明现在学习资源这么丰富，B站、知乎、各种在线课程平台，什么都有。但为什么很多人还是在数据学习的路上迷茫？

直到有一天，一个朋友跟我说：**&quot;那些教程太冷了，就像在看说明书。&quot;**

这句话点醒了我。

## 技术教程的&quot;冷&quot;

现在大部分的技术教程确实很&quot;冷&quot;：

### 1. 缺乏情感连接
- 只有知识点，没有学习的温度
- 只有代码，没有背后的思考过程
- 只有结果，没有踩坑的经历

### 2. 缺乏真实场景
- 案例都是编造的toy dataset
- 脱离实际工作场景
- 解决的都是假问题

### 3. 缺乏成长路径
- 东一榔头西一棒子
- 没有清晰的学习线路图
- 不知道学完能做什么

### 4. 缺乏人文关怀
- 不关心学习者的背景和困难
- 不考虑学习者的心理状态
- 没有陪伴和鼓励

## 数据学习需要&quot;温度&quot;

我想要的数据学习是什么样的？

### 有故事的学习
每个知识点都有它的来龙去脉。比如学SQL，不是一上来就讲语法，而是先讲：

&gt; &quot;想象你是一个图书管理员，面对浩如烟海的书籍，你需要一种方法来快速找到读者想要的书。SQL就是这样一种&apos;对话语言&apos;，让你可以和数据库&apos;交流&apos;...&quot;

### 有情感的学习
承认学习的困难，理解学习者的焦虑：

&gt; &quot;学不会很正常，我当年也是。记得第一次写JOIN语句的时候，连续报错了一个下午，最后发现是少写了一个逗号。那种挫败感我现在还记得...&quot;

### 有温度的陪伴
不是冷冰冰的知识灌输，而是像朋友一样的陪伴：

&gt; &quot;今天的内容可能有点难，没关系，我们慢慢来。记住，每个数据分析师都是这样一步步成长起来的，包括我...&quot;

## 拾穗数据的理念

**&quot;拾穗&quot;** 这个名字来自于米勒的名画《拾穗者》。画中的女性在收获后的田野里，弯腰捡拾遗落的麦穗。

这正是我想传达的理念：

### 1. 珍惜每一个知识点
就像珍惜每一颗麦穗一样，不放过任何一个可以让你成长的细节。

### 2. 踏实而温暖
学习是一个踏实的过程，需要一点一滴的积累，也需要温暖的陪伴。

### 3. 收获的喜悦
每掌握一个技能，都像拾到一颗饱满的麦穗，带来成长的喜悦。

## 我想做的不一样的地方

### 1. 生活化的比喻
把复杂的技术概念用生活中的例子来解释。比如：

- **数据仓库** 就像一个大型超市的仓库
- **ETL过程** 就像超市的进货、理货、上架流程
- **用户画像** 就像你对朋友的了解和印象

### 2. 真实的职场场景
所有的案例都来自真实的工作场景：

- 真实的数据问题
- 真实的解决方案
- 真实的踩坑经历

### 3. 完整的成长路径
从零基础到专家，每一步都有清晰的指引：

- 知道现在在哪里
- 知道下一步去哪里
- 知道最终能到达哪里

### 4. 心理建设和技能并重
不只是教技术，更关注学习者的心理状态：

- 如何克服学习焦虑
- 如何保持学习动力
- 如何建立自信心

## 拾穗数据包含什么

基于10年的数据领域经验，我在拾穗数据中整理了：

### 📚 完整的学习体系
- **零基础入门路径**：从Excel到Python，循序渐进
- **进阶技能提升**：SQL优化、数据建模、机器学习
- **架构设计能力**：数据仓库、实时数据、大数据架构

### 💼 真实的职场指导
- **求职面试攻略**：简历优化、面试技巧、薪资谈判
- **职业发展规划**：从分析师到专家的成长路径
- **技能薪资对照**：不同技能水平的市场价值

### 🛠 实战项目经验
- **完整项目案例**：从需求分析到方案交付
- **踩坑经验分享**：避免常见的错误和陷阱
- **工具使用技巧**：提升工作效率的实用方法

### 🔥 持续更新内容
- **行业动态分析**：数据领域的最新趋势
- **技术发展跟踪**：新工具、新方法的实践
- **读者问题解答**：基于真实问题的深度解答

## 一个小愿望

我希望拾穗数据能成为一个**有温度的学习社区**，在这里：

- **学习不再孤单**：有同路人的陪伴和鼓励
- **成长看得见**：清晰的进步路径和里程碑
- **知识有深度**：不只是教会你怎么做，更告诉你为什么这么做
- **未来有方向**：知道学这些能干什么，能去哪里

## 写在最后

创建拾穗数据，不是因为我觉得自己有多厉害，而是因为我在学习和工作中受过太多的挫折，踩过太多的坑，我想让后来的学习者少走一些弯路。

如果你也在数据学习的路上，如果你也希望学习能有一些温度，欢迎来看看 **[拾穗数据](https://pro.ss-data.cc?utm_source=blog&amp;utm_campaign=why_create)**。

不管你现在处在什么阶段，不管你遇到什么困难，记住：

**每一个优秀的数据分析师，都曾经是一个迷茫的初学者。**

让我们一起在数据的田野里，拾取属于我们的麦穗。

---

*有任何问题或想法，欢迎通过微信和我交流。我们一起成长。*</content:encoded></item><item><title>关于caffeinate命令这件小事——让电脑保持清醒的哲学</title><link>https://blog.rockythink.work/blog/mac-caffeinate-command-guide</link><guid isPermaLink="true">https://blog.rockythink.work/blog/mac-caffeinate-command-guide</guid><description>以王小波式的幽默探讨Mac caffeinate命令的使用场景，从程序员的日常烦恼说起，聊聊如何让电脑和我们一样保持清醒</description><pubDate>Sun, 27 Jul 2025 00:00:00 GMT</pubDate><content:encoded>## 关于电脑睡觉这件事

我一直觉得，电脑和人一样，都有睡觉的权利。但问题是，它们睡觉的时机总是不太合适。比如说，你正在下载一个几个G的文件，准备去倒杯咖啡，回来发现电脑睡着了，下载也停了。这时候你会产生一种奇怪的愤怒，就像半夜被室友的呼噜声吵醒一样。

王小波说过：&quot;人的一切痛苦，本质上都是对自己无能的愤怒。&quot;我觉得这话用在和电脑的关系上也挺合适。我们对电脑自作主张去睡觉这件事的愤怒，本质上是对自己不知道如何控制它的无奈。

好在苹果的工程师们也想到了这个问题，于是给我们提供了一个叫`caffeinate`的命令。这个名字起得很有意思，就像给电脑喂咖啡一样，让它保持清醒。

## 程序员的日常烦恼

作为一个程序员，我经常遇到这样的场景：

**场景一：长时间编译**
你知道那种感觉吗？启动一个大项目的编译，预计需要半小时。你想去外面透透气，但又担心电脑睡着了编译会停止。这时候你就需要caffeinate了：

```bash
caffeinate -i make build
```

这个命令会在make build执行期间保持系统清醒。`-i`参数表示阻止系统空闲睡眠，但允许用户主动让系统睡眠。很人性化，对吧？

**场景二：下载大文件**
有时候你需要下载一个几GB的Docker镜像或者系统更新，这个过程可能需要几个小时。你总不能一直坐在电脑前盯着进度条，但又不想让下载中断：

```bash
caffeinate -d -t 7200 &amp;
# 然后开始你的下载任务
```

`-d`参数防止显示器睡眠，`-t 7200`表示保持清醒2小时。这样你就可以安心去做别的事情了。

**场景三：演示或会议**
最尴尬的事情莫过于在重要会议上做演示时，电脑突然黑屏进入睡眠。这时候你需要：

```bash
caffeinate -d -u -t 3600
```

`-u`参数会模拟用户活动，`-d`保持显示器清醒。一小时的时间应该足够你完成大部分演示了。

## 关于选择的哲学

王小波在《沉默的大多数》里写道：&quot;人的一切痛苦，本质上都是对自己无能的愤怒。&quot;我觉得学会使用caffeinate这样的工具，某种程度上是在减少这种无能感。

你看，我们现在有了选择权：
- 想让电脑一直清醒？用`caffeinate -i`
- 只想保持显示器不黑屏？用`caffeinate -d`
- 想模拟用户操作防止屏保？用`caffeinate -u`
- 想阻止硬盘睡眠？用`caffeinate -m`

## 实用的使用方法

### 基础用法

```bash
# 基本用法：保持系统清醒直到手动停止
caffeinate

# 保持清醒2小时
caffeinate -t 7200

# 在特定命令执行期间保持清醒
caffeinate ./long-running-script.sh
```

### 组合使用

```bash
# 防止显示器睡眠且模拟用户活动（适合演示）
caffeinate -d -u -t 3600

# 防止系统和硬盘睡眠（适合大文件操作）
caffeinate -i -m rsync -av /large/folder/ /backup/
```

### 后台运行

```bash
# 在后台保持系统清醒
caffeinate -i -t 3600 &amp;

# 查看正在运行的caffeinate进程
ps aux | grep caffeinate

# 停止后台的caffeinate
killall caffeinate
```

## 一些哲学思考

使用caffeinate这个命令让我想起了很多事情。比如说，我们总是在寻找控制感。控制自己的时间，控制自己的工作，控制自己的电脑。而这个小小的命令，给了我们一种控制电脑睡眠的能力。

王小波说：&quot;我活在世上，无非想要明白些道理，遇见些有趣的事。&quot;我觉得发现caffeinate这样的工具，某种程度上也算是遇见了有趣的事。它让我们意识到，原来系统的睡眠策略是可以控制的，原来我们可以告诉电脑什么时候该睡，什么时候该醒。

## 注意事项

当然，使用caffeinate也要适度。长时间阻止系统睡眠会增加耗电量，也会让风扇转得更久。就像人不能总是熬夜一样，电脑也需要适当的休息。

另外，如果你在使用笔记本电脑，要注意电池电量。caffeinate不会魔法般地增加你的电池续航，它只是让你的电脑更有效地利用醒着的时间。

## 结语

我觉得学会使用这些小工具，某种程度上是在学会与技术和谐相处。我们不是技术的奴隶，也不是它的主人，我们是合作伙伴。caffeinate这个命令，就像是我们和电脑之间的一个约定：嘿，哥们，这段时间你先别睡，我有事要做。

正如王小波所说：&quot;我希望自己是一个有趣的人。&quot;我觉得会用caffeinate的程序员，至少在电脑面前是个有趣的人。因为他知道如何让电脑在合适的时候保持清醒，也知道如何让它在应该休息的时候好好睡觉。

这就是技术的魅力：它让我们有了更多的选择，也让我们承担了更多的责任。而承担责任的第一步，就是学会使用正确的工具。

---

*后记：写这篇文章的时候，我就用了`caffeinate -d -t 1800`命令，确保在我思考和写作的过程中屏幕不会突然黑掉。看吧，这就是实用主义的胜利。*</content:encoded></item></channel></rss>