欢迎访问我的中文博客!
Jiamin's 博客
Apache Hive实现自定义存储格式
Apache Hive实现自定义存储格式 背景 在某些业务场景中,下游处理系统需要直接处理数据文件。虽然Hive官方支持text, orc, parquet等格式,但为了应对更多样化的业务场景,学习如何开发自定义存储格式变得十分重要。Hive目前提供了ROW FORMAT SERDE机制来实现这一需求。
ROW FORMAT SERDE Hive的ROW FORMAT SERDE是一个关键的数据格式化概念,它定义了如何解析和映射存储在Hive表中的数据。SERDE代表序列化和反序列化,这涉及到数据在写入Hive表时和从Hive表读取时的转换过程。
快速开始 考虑一种业务场景,我们希望数据本身没有列分隔符,而是采用固定宽度的字段。在Hive中,设置列分隔符为空字符串是不被直接支持的。为了解决这个问题,接下来将实现一个自定义的SerDe。
首先从结果出发:
代码打包后的jar名称为 hive-fixed-serde-1.0-SNAPSHOT.jar
添加自定义serde jar包
add jar hdfs:///path/hive-fixed-serde-1.0-SNAPSHOT.jar 建表指定实现类org.apache.hadoop.hive.serde2.fixed.FixedLengthTextSerDe, 且每个字段定长分别为10, 5, 8 CREATE TABLE fixed_length_table ( column1 STRING, column2 STRING, column3 STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.fixed.FixedLengthTextSerDe' WITH SERDEPROPERTIES ( "field.lengths"="10,5,8" ) STORED AS TEXTFILE; 当写入数据不满足定长时候, 向后补充空格, 写入 insert into fixed_length_table values ("1", "1", "1") 实际文件内容:
1 1 1 实现 FixedLengthTextSerDe 继承自org.apache.hadoop.hive.serde2.AbstractSerDe,需要实现以下方法:
initialize: 创建建表语句中field.lengths的配置。 getSerDeStats: 返回统计信息。 deserialize: 将文件内容里的数据转换为Hive的ROW。 serialize: 将Hive的ROW转换为实际写文件的内容。本次目的是将数据补位,按空格补充到规定要求的定长。 getSerializedClass: 仅针对text格式。 完整代码:
Jiamin's 博客
OpenAI 11.06更新
OpenAI 11.06更新 在这篇博客中,将讨论 OpenAI 11.06 的一些更新,更新主要有:
聊天内容支持图片, gpt-4-vision-preview 返回内容支持json模式 引入system_fingerprint, 支持可复现性 OpenAI 多模态模型 OpenAI 引入的最令人兴奋的新功能之一是多模态模型,它可以处理文本和图像的组合。这一能力为 AI 应用打开了一个新的维度,从增强的视觉数据分析到更互动的聊天机器人。
GPT-4 Vision: gpt-4-vision-preview 示例: 分析阿里巴巴股票的K线.
import openai openai.api_key = "your-api-key" response = openai.ChatCompletion.create( model="gpt-4-vision-preview", messages=[ { "role": "user", "content": [ {"type": "text", "text": "What information can you understand from the K-line of the image?"}, { "type": "image_url", "image_url": "https://mggg.cloud/img/ali.png", }, ], } ], max_tokens=300, ) print(response.choices[0].message.content) output:
The image appears to show a candlestick chart for a stock, specifically ticker 'BABA' which is Alibaba Group Holding Limited.
Jiamin's 博客
Langchain LLM Streaming
Langchain LLM Streaming langchain通过callback机制,可以将LLM输出的token实时处理
from langchain.chat_models import ChatOpenAI from langchain.schema import ( HumanMessage, ) from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler chat = ChatOpenAI(streaming=True, callbacks=[StreamingStdOutCallbackHandler()], temperature=0) resp = chat([HumanMessage(content="Write me a song about sparkling water.")]) langchian同时支持同步IO和异步IO的方式来输出token,分别对应StreamingStdOutCallbackHandler 和AsyncIteratorCallbackHandler
StreamingStdOutCallbackHandler 首先可以看看Langchain官方实现StreamingStdOutCallbackHandler, 将LLM输出的token实时打印在终端, 主要实现了on_llm_new_token
class StreamingStdOutCallbackHandler(BaseCallbackHandler): ... def on_llm_new_token(self, token: str, **kwargs: Any) -> None: """Run on new LLM token. Only available when streaming is enabled.""" sys.stdout.write(token) sys.stdout.flush() 但这种方式是同步的,接下来看看异步IO的方式
AsyncIteratorCallbackHandler 以下是使用AsyncIteratorCallbackHandler, 异步打印返回的token
import asyncio from langchain.callbacks import AsyncIteratorCallbackHandler from langchain.
Jiamin's 博客
基于LangChain向量数据库,为LLM添加实时的领域知识
基于langchain向量数据库, 为LLM添加最新的领域知识 在我们使用的chatgpt的时候,往往会遇到一些提示:
截止到2021年9月的训练数据。 因此,我不具备在那个时间点之后发生的事件或获取的信息。 如果你有关于2021年9月之后的问题,我可能就无法提供最新的信息。 因此,为了让LLM模型具备实时的领域知识,将实时的信息添加到模型中变得非常必要。接下来,我们将介绍如何通过LangChain和Chroma向量数据库,为ChatGPT添加最新的领域知识。
步骤如下:
训练文档知识,存到本地向量数据库chroma 根据用户prompt去查询向量数据库, 根据相似度获取相似领域知识 包装领域知识到prompt中 LangChain + Chroma 将文档知识嵌入并存储到本地向量数据库Chroma中。 根据用户的提示查询向量数据库,获取相似领域知识。 代码如下, 我们通过 add_text_embedding来解析文本为向量, 通过query来查询相似度的领域知识
from langchain.embeddings import OpenAIEmbeddings from langchain.text_splitter import CharacterTextSplitter from langchain.vectorstores import Chroma class EmbeddingLocalBackend(object): def __init__(self, path='db'): self.path = path self.vectordb = Chroma(persist_directory=self.path, embedding_function=OpenAIEmbeddings(max_retries=9999999999)) def add_text_embedding(self, data, auto_commit=True): text_splitter = CharacterTextSplitter( separator="\n", chunk_size=1000, chunk_overlap=200, length_function=len, is_separator_regex=False, ) documents = text_splitter.create_documents(data) self.vectordb.add_documents(documents) if auto_commit: self._commit() def _commit(self): self.vectordb.persist() def query(self, query): embedding_vector = OpenAIEmbeddings().
Jiamin's 博客
为Nginx设置免费的HTTPS证书(使用Let's Encrypt)
简介 使用HTTPS保护网站不仅可以确保数据完整性,还可以增强用户信任和搜索引擎排名。通过Let’s Encrypt,您可以轻松地为Nginx Web服务器获取免费的SSL/TLS证书。在本指南中,我们将为您介绍如何在CentOS上为Nginx服务器设置Let’s Encrypt证书。
sudo yum install epel-release sudo yum install certbot Step 2: 安装Certbot Nginx插件 为了简化获取和安装证书的过程,Certbot为Nginx提供了一个专用的插件。使用以下命令安装Certbot Nginx插件:
sudo yum install -y python3-certbot-nginx Step 3: 为Nginx生成证书 现在Certbot和Nginx插件已安装,可以生成SSL/TLS证书。请在下面的命令中将yourdomain.com替换为您的域名,然后运行它:
sudo certbot --nginx -d yourdomain.com warning: 请记得替换您的域名
Certbot会进行交互,引导选择适当的选项并配置证书详细信息。
Step 4: 自动Nginx配置 获得证书后,Certbot将自动修改Nginx配置以启用HTTPS访问。它将在nginx.conf文件中处理必要的更改,将HTTP流量重定向到安全的HTTPS协议。
总结 通过遵循这些简单的步骤,成功使用免费的Let’s Encrypt SSL/TLS证书保护了Nginx Web服务器。现在,网站访问者可以享受安全的加密浏览体验,增强了他们对网站的信任,并提高了在搜索引擎结果中的可见性。
请定期更新Let’s Encrypt证书,以确保持续保护网站安全。Certbot内置的自动更新功能可以让这一过程变得轻松无忧。
Jiamin's 博客
向量数据库:Weaviate
向量数据库:Weaviate Weaviate是一个创新的向量数据库,提供了强大的数据存储和检索功能。
通过使用向量来索引数据对象,Weaviate可以根据其语义属性存储和检索数据对象。 Weaviate可以独立使用(带上你的向量),或与各种模块结合使用,对您的核心功能进行矢量化和增强。 多亏了其独特的设计,Weaviate确保了快速的性能和高效的操作。 QuickStart: 要部署Weaviate,可以使用docker-compose。对于文本嵌入转换,我们将使用OpenAI模块:
--- version: '3.4' services: weaviate: image: semitechnologies/weaviate:1.20.0 restart: on-failure:0 ports: - "8080:8080" environment: QUERY_DEFAULTS_LIMIT: 20 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: "./data" DEFAULT_VECTORIZER_MODULE: text2vec-openai ENABLE_MODULES: text2vec-openai OPENAI_APIKEY: sk-xxx # replace with your OpenAI key CLUSTER_HOSTNAME: 'node1' 使用Weaviate和OpenAI 1. 建立链接 首先,我们建立与Weaviate向量数据库的连接:
pip install weaviate-client import weaviate client = weaviate.Client( url = "http://localhost:8080" ) client.is_live() 2. 插入数据 一旦与Weaviate向量数据库的连接正常,我们可以开始插入数据:
uuid = client.data_object.create({ 'question': 'This vector DB is OSS & supports automatic property type inference on import', 'somePropNotInTheSchema': 123, # automatically added as a numeric property }, 'JeopardyQuestion') print(uuid) 3.
Jiamin's 博客
关于我
大家好!我是一名大数据工程师,拥有五年的工作经验。
技术栈: 编程语言: Python, Java, Scala
大数据生态: Apache Spark, Apache Flink, Apache Hadoop, Apache Iceberg
云原生: Kubernetes (K8s), Azure, Google cloud, AWS
证书 Google Cloud Certified Professional Data Engineer: Certified Kubernetes Application Developer (CKAD): 祝好,
家敏
Jiamin's 博客
使用基于ChatGPT的Chrome扩展创建Anki卡片
通过记忆软件Anki,有效地组织和记忆零散的信息, 它使用分散重复的方法来帮助我们回忆。然而,创建Anki卡片的过程可能非常耗时。
为了解决这个问题,开发了一个基于ChatGPT的Chrome扩展工具,帮助快速高效地创建Anki卡片。
这个Chrome扩展工具的诞生基于两个基本需求:
在上网浏览时,需要收集有价值的碎片信息,并使用ChatGPT将其整理成Anki卡片。 在备考考试/认证或者记忆面试的标准答案时的必要性。 如何使用基于ChatGPT的Chrome扩展创建Anki卡片 通过zip包安装Chrome扩展:下载链接。
设置相关配置并保存。
当您遇到感兴趣的内容时,选择文本并使用ChatGPT将其总结成Anki卡片。
完成后,您可以在Anki中开始复习。
基于ChatGPT的Chrome扩展不仅可以帮助您节省创建Anki卡片的时间,还可以使学习过程更加高效。