0%

jq 处理 JSON 详解:从安装到高级应用

在日常工作中,JSON 格式的日志、配置文件或接口响应非常常见,jq 作为轻量级的命令行 JSON 处理器,能高效完成过滤、提取、分组、计数等操作,是处理 JSON 数据的必备工具。本文将从安装 jq 开始,围绕 JSON 数组和 “每行一个 JSON 对象”(JSON Lines)两种常见格式,详解 jq 的核心用法。

安装 jq

jq 不是系统默认安装的工具,需手动安装,以下是主流操作系统的安装方法:

Linux 系统

(1)Debian/Ubuntu 系列
1
sudo apt-get update && sudo apt-get install -y jq
(2)CentOS/RHEL 系列
1
2
3
4
5
6
# CentOS 7 及以上(需启用 EPEL 源)
sudo yum install -y epel-release
sudo yum install -y jq

# CentOS 8 / Rocky Linux 等(使用 dnf)
sudo dnf install -y jq
(3)Fedora
1
sudo dnf install -y jq
(4)Arch Linux
1
sudo pacman -S jq

macOS 系统

(1)使用 Homebrew(推荐)
阅读全文 »

推荐系统中的协同过滤算法:原理、实现与应用

协同过滤(Collaborative Filtering)是推荐系统中最经典且应用广泛的算法之一,其核心思想是利用用户群体的行为数据(如评分、点击、购买),发现用户或物品之间的相似性,进而为用户推荐其可能感兴趣的物品。与基于内容的推荐不同,协同过滤无需依赖物品的具体特征(如电影的类型、书籍的作者),仅通过用户行为的 “协同” 模式即可生成推荐。

协同过滤的核心思想与分类

协同过滤的核心假设是:

如果用户 A 和用户 B 在过去对某些物品有相似的偏好,那么用户 A 未来可能喜欢用户 B 喜欢的其他物品;反之亦然。

根据数据利用方式的不同,协同过滤可分为两大主流类型:

  1. 基于用户的协同过滤(User-Based Collaborative Filtering) 找到与目标用户兴趣相似的 “邻居用户”,将邻居用户喜欢的物品推荐给目标用户。
  2. 基于物品的协同过滤(Item-Based Collaborative Filtering) 计算物品之间的相似度(如 “喜欢物品 A 的用户也喜欢物品 B”),为用户推荐与其之前喜欢的物品相似的其他物品。

基于用户的协同过滤(User-Based CF)

算法流程

步骤 1:构建用户 - 物品评分矩阵

假设存在用户集合U = {u1, u2, ..., um}和物品集合I = {i1, i2, ..., in},构建一个m×n的评分矩阵R,其中R[u][i]表示用户u对物品i的评分(若未评分则为 0 或空)。

示例矩阵(行:用户,列:物品,值:评分 1-5):

用户 \ 物品 电影 A 电影 B 电影 C 电影 D 电影 E
用户 1 5 4 0 0 1
用户 2 0 0 5 4 0
用户 3 5 0 0 0 1
用户 4 0 0 4 5 0
步骤 2:计算用户相似度

衡量两个用户uv的相似度,常用方法:

  • 皮尔逊相关系数(Pearson Correlation):衡量两个用户评分趋势的一致性(取值范围 [-1,1],越接近 1 越相似)。 公式:

    $\text{sim}(u,v) = \frac{\sum{i \in I{uv}} (R[u][i] - \bar{R}[u]) \cdot (R[v][i] - \bar{R}[v])}{\sqrt{\sum{i \in I{uv}} (R[u][i] - \bar{R}[u])^2} \cdot \sqrt{\sum{i \in I{uv}} (R[v][i] - \bar{R}[v])^2}}$

    其中,I_uv是用户uv共同评分的物品集合,\bar{R}[u]是用户u的平均评分。

  • 余弦相似度(Cosine Similarity):将用户的评分向量视为高维空间中的向量,相似度为向量夹角的余弦值(取值范围 [0,1])。 公式:

    $\text{sim}(u,v) = \frac{\sum{i \in I} R[u][i] \cdot R[v][i]}{\sqrt{\sum{i \in I} R[u][i]^2} \cdot \sqrt{\sum_{i \in I} R[v][i]^2}}$

阅读全文 »

Hadoop 配置实践:从零开始搭建单机环境

以下以 Apache Hadoop 2.7.x 为例,讲解单机环境的核心配置与启动流程(生产环境需配置分布式集群)。

步骤 1:核心配置文件

Hadoop 配置文件位于 $HADOOP_HOME/etc/hadoop 目录,主要包括:

1. core-site.xml(核心配置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- NameNode 节点的 URI:协议、主机、端口 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<!-- Hadoop 临时文件存储目录(需手动创建)
如果在hdfs-site.xml中不配置NameNode节点和DataNode节点的数据存放位置时,默认放在该目录下
-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/data/hadoop/tmp</value>
</property>
<!-- 缓冲区大小,默认 4096 -->
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
</configuration>

2. hdfs-site.xml(HDFS 配置)

阅读全文 »

八皇后问题

八皇后问题是经典的回溯算法应用案例,由国际象棋棋手马克斯・贝瑟尔于 1848 年提出。问题要求在 8×8 的国际象棋棋盘上放置 8 个皇后,使得任意两个皇后不能处于同一行、同一列或同一斜线上,最终找出所有可能的摆放方案。

一、问题核心约束

放置皇后时需满足以下条件:

  1. 不同行:每一行只能放置 1 个皇后(可通过按行放置天然满足)。
  2. 不同列:任意两个皇后不能在同一列。
  3. 不同斜线:任意两个皇后不能在同一对角线(包括主对角线和副对角线)。

若用坐标 (row, col) 表示皇后位置,则对于两个皇后 (r1, c1)(r2, c2),需满足:

  • c1c2(不同列)
  • (|r1r2||c1c2|)(不同斜线,即行差不等于列差)

二、解决方案:回溯算法

回溯算法是解决八皇后问题的最优方法,其核心思想是逐行尝试放置皇后,若当前位置不满足约束则回退到上一行,尝试下一列,直到找到所有合法方案。

算法步骤:

  1. 初始化:创建一个数组 queens 记录每一行皇后的列位置(索引为行号,值为列号)。

  2. 递归放置:从第 0 行开始,逐行尝试在每一列放置皇后:

    • 检查当前列是否与已放置的皇后冲突(列冲突或斜线冲突)。
  • 若不冲突,放置皇后并递归处理下一行。

    • 若冲突,尝试下一列。

阅读全文 »

逆波兰表达式(Reverse Polish Notation, RPN)

逆波兰表达式是一种数学表达式的表示方法,其特点是运算符位于操作数之后,无需使用括号来指定运算顺序,因此也被称为 “后缀表达式”。它在计算机科学中被广泛应用于表达式求值、编译器设计等领域。

基本概念

与传统表达式的对比

  • 中缀表达式(日常使用):运算符位于操作数中间,如 3 + 4 × 2 ÷ (1 - 5)。 缺点:需要括号和运算符优先级(先乘除后加减)来确定运算顺序,计算机解析复杂。
  • 逆波兰表达式(后缀表达式):运算符位于操作数之后,如 3 4 2 × 1 5 - ÷ +。 优点:无需括号,仅通过顺序扫描即可确定运算顺序,计算机解析高效。

核心原理

逆波兰表达式的求值过程可通过(Stack)数据结构实现,步骤如下:

  1. 从左到右扫描表达式的每个元素(操作数或运算符)。
  2. 若遇到操作数,将其压入栈中。
  3. 若遇到运算符,从栈中弹出两个操作数(注意顺序:后弹出的是第一个操作数),使用该运算符计算结果,再将结果压回栈中。
  4. 扫描结束后,栈中仅剩的元素即为表达式的结果。
阅读全文 »

域名更新通知

您好!我们的官方域名已更新为 zhhll.com.cn。 请收藏新域名以获取最佳访问体验。