<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>数据库 on 嘴强黑客 /pbuff07</title><link>https://pbuff07.github.io/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/</link><description>Recent content in 数据库 on 嘴强黑客 /pbuff07</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 11 Jun 2025 14:00:00 +0800</lastBuildDate><atom:link href="https://pbuff07.github.io/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/index.xml" rel="self" type="application/rss+xml"/><item><title>sqlite中文字段名查不出数据</title><link>https://pbuff07.github.io/posts/2025-06-11-sqlite3%E4%B8%AD%E6%96%87%E5%AD%97%E6%AE%B5%E5%90%8D%E6%9F%A5%E4%B8%8D%E5%87%BA%E6%95%B0%E6%8D%AE/</link><pubDate>Wed, 11 Jun 2025 14:00:00 +0800</pubDate><guid>https://pbuff07.github.io/posts/2025-06-11-sqlite3%E4%B8%AD%E6%96%87%E5%AD%97%E6%AE%B5%E5%90%8D%E6%9F%A5%E4%B8%8D%E5%87%BA%E6%95%B0%E6%8D%AE/</guid><description>&lt;p&gt;原始查询语句：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;select&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;from&lt;/span&gt; icp &lt;span style="color:#66d9ef"&gt;where&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;域名&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;like&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;%baidu%&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;问题：列名 &amp;lsquo;域名&amp;rsquo; 使用单引号，被解析为字符串字面量，而不是列名，导致查询失败。&lt;/p&gt;
&lt;p&gt;修正：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;select&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;from&lt;/span&gt; icp &lt;span style="color:#66d9ef"&gt;where&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;域名&amp;#34;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;like&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;%knownsec%&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Spark基础</title><link>https://pbuff07.github.io/posts/2025-01-11-spark%E5%9F%BA%E7%A1%80/</link><pubDate>Sat, 11 Jan 2025 11:10:01 +0800</pubDate><guid>https://pbuff07.github.io/posts/2025-01-11-spark%E5%9F%BA%E7%A1%80/</guid><description>&lt;h1 id="spark"&gt;Spark&lt;/h1&gt;
&lt;p&gt;参考文档&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://spark.apache.org/docs/3.5.1/sql-ref-datetime-pattern.html#content"&gt;https://spark.apache.org/docs/3.5.1/sql-ref-datetime-pattern.html#content&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="spark读取数据"&gt;spark读取数据&lt;/h4&gt;
&lt;p&gt;spark可以使用spark.read.load加载各类数据源&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df = spark.read.load(&amp;#34;examples//users.parquet&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;支持的数据源有：json, parquet, jdbc, orc, libsvm, csv, text&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; pf &lt;span style="color:#66d9ef"&gt;=&lt;/span&gt; spark&lt;span style="color:#f92672"&gt;.&lt;/span&gt;read&lt;span style="color:#f92672"&gt;.&lt;/span&gt;parquet&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;xxxxx&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="spark创建临时视图便于查询"&gt;spark创建临时视图便于查询&lt;/h4&gt;
&lt;p&gt;有个疑问是否这些数据源都可以通过读取之后创建临时视图并进行spark sql查询呢？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;pf.createOrReplaceTempView(&amp;ldquo;http&amp;rdquo;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;经过测试，parquet和json都可以创建临时视图并查询。但text类型创建临时视图后查询结果只有value一列，无法进行where条件筛选。&lt;/p&gt;
&lt;p&gt;text类型查看文件结构：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;scala&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; txt_res&lt;span style="color:#f92672"&gt;.&lt;/span&gt;printSchema&lt;span style="color:#f92672"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|--&lt;/span&gt; value&lt;span style="color:#66d9ef"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;nullable&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="读取parquet数据并使用sparksql查询"&gt;读取parquet数据并使用spark.sql查询&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;var pf &lt;span style="color:#f92672"&gt;=&lt;/span&gt; spark.&lt;span style="color:#66d9ef"&gt;read&lt;/span&gt;.parquet(&lt;span style="color:#e6db74"&gt;&amp;#34;/data/xx_data&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pf.createOrReplaceTempView(&lt;span style="color:#e6db74"&gt;&amp;#34;http&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;spark.&lt;span style="color:#66d9ef"&gt;sql&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;select * from http limit 2&amp;#34;&lt;/span&gt;).coalesce(&lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt;).&lt;span style="color:#66d9ef"&gt;write&lt;/span&gt;.parquet(&lt;span style="color:#e6db74"&gt;&amp;#34;/tmp/xx_data_res&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="sparksql查询结果显示"&gt;spark.sql查询结果显示&lt;/h4&gt;
&lt;p&gt;默认使用.show()只会显示前20条&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;spark.sql(&amp;#34;xxxxx&amp;#34;).show()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果想全部显示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;spark&lt;span style="color:#f92672"&gt;.&lt;/span&gt;sql&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;xxxx&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;).&lt;/span&gt;collect&lt;span style="color:#f92672"&gt;().&lt;/span&gt;foreach&lt;span style="color:#f92672"&gt;(&lt;/span&gt;println&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="sparksql结果输出不同文件格式"&gt;spark.sql结果输出不同文件格式&lt;/h4&gt;
&lt;p&gt;parquet:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;spark&lt;span style="color:#f92672"&gt;.&lt;/span&gt;sql&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;xxx&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;).&lt;/span&gt;coalesce&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt;&lt;span style="color:#f92672"&gt;).&lt;/span&gt;write&lt;span style="color:#f92672"&gt;.&lt;/span&gt;parquet&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/tmp/xx_data_res&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;csv:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;spark&lt;span style="color:#f92672"&gt;.&lt;/span&gt;sql&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;xxx&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;).&lt;/span&gt;coalesce&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt;&lt;span style="color:#f92672"&gt;).&lt;/span&gt;write&lt;span style="color:#f92672"&gt;.&lt;/span&gt;format&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;csv&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;).&lt;/span&gt;save&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/tmp/xx_data_res&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;json:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-scala" data-lang="scala"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;spark&lt;span style="color:#f92672"&gt;.&lt;/span&gt;sql&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;xxx&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;).&lt;/span&gt;coalesce&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt;&lt;span style="color:#f92672"&gt;).&lt;/span&gt;write&lt;span style="color:#f92672"&gt;.&lt;/span&gt;format&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;).&lt;/span&gt;save&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/tmp/xx_data_res&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="coalesce操作"&gt;.coalesce()操作&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;coalesce&lt;/code&gt; 是一个用于重新分区（reduce the number of partitions）的操作。它可以减少数据集的分区数量，这在需要减少分区以优化性能或资源使用时非常有用。&lt;/p&gt;
&lt;p&gt;通过减少分区数量，可以减少任务启动的开销。对于大数据集，分区过多会导致大量的小任务启动，从而增加任务调度的开销。将分区数量减少到合理范围可以提高性能。&lt;/p&gt;
&lt;p&gt;使用下面的命令将数据重新分区为1024个分区。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;val coalescedDF = df.coalesce(1024)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="sparksql中常见函数用到就记录"&gt;spark.sql中常见函数（用到就记录）&lt;/h4&gt;
&lt;p&gt;按照特定的日期格式处理字段&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;select&lt;/span&gt; date_format(start_time, &lt;span style="color:#e6db74"&gt;&amp;#39;yyyy-MM-dd&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="spark读取多个文件数据"&gt;spark读取多个文件数据&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;可直接用*全部指定或者{}部分指定&lt;/p&gt;</description></item><item><title>Clickhouse查询字段内容均匀分布</title><link>https://pbuff07.github.io/posts/2024-12-14-clickhouse%E6%9F%A5%E8%AF%A2%E7%BB%93%E6%9E%9C%E5%9D%87%E5%8C%80%E5%88%86%E5%B8%83/</link><pubDate>Sat, 14 Dec 2024 14:00:00 +0800</pubDate><guid>https://pbuff07.github.io/posts/2024-12-14-clickhouse%E6%9F%A5%E8%AF%A2%E7%BB%93%E6%9E%9C%E5%9D%87%E5%8C%80%E5%88%86%E5%B8%83/</guid><description>&lt;p&gt;需求：Clickhouse查询结果中要求某个字段的数据较为均匀的分布。比如 &lt;code&gt;rule_id IN (10000, 10001, 10002, 10003)&lt;/code&gt;，需要保证每个id都有数据。&lt;/p&gt;
&lt;p&gt;实现：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;table_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; rule_id &lt;span style="color:#66d9ef"&gt;IN&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;10000&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10001&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10002&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10003&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 按rule_id分组并随机排序，确保均匀性。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ORDER&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; rule_id, rand()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- rule_id限制导出500条
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;LIMIT&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;500&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; rule_id
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Clickhouse编写UDF</title><link>https://pbuff07.github.io/posts/2024-12-09-clickhouse%E6%96%B0%E5%A2%9Eudf/</link><pubDate>Mon, 09 Dec 2024 14:00:00 +0800</pubDate><guid>https://pbuff07.github.io/posts/2024-12-09-clickhouse%E6%96%B0%E5%A2%9Eudf/</guid><description>&lt;h1 id="udf"&gt;UDF&lt;/h1&gt;
&lt;p&gt;UDF全称User Define Function，即用户自定义函数。新版本的Clickhouse支持用户自己定义sql查询用的函数，调用外部的Python、Shell、Golang的脚本即可。&lt;/p&gt;
&lt;h1 id="clickhouse新增udf"&gt;Clickhouse新增UDF&lt;/h1&gt;
&lt;p&gt;创建一个示例UDF函数。&lt;/p&gt;
&lt;p&gt;首先在 &lt;code&gt;/etc/clickhouse-server/&lt;/code&gt; 目录下新增一个 &lt;code&gt;icp_unitname_function.xml&lt;/code&gt; 文件&lt;/p&gt;
&lt;p&gt;坑：注意文件名一定要有_function.xml，不管前面名称是什么这个必须有，因为config.xml文件中默认加载的udf函数配置是必须有_function.*ml&lt;/p&gt;
&lt;p&gt;编辑&lt;code&gt;icp_unitname_function.xml&lt;/code&gt;添加如下内容&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;functions&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;function&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;type&amp;gt;&lt;/span&gt;executable&lt;span style="color:#f92672"&gt;&amp;lt;/type&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;icp_unitname&lt;span style="color:#f92672"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;return_type&amp;gt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;lt;/return_type&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;argument&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;type&amp;gt;&lt;/span&gt;String&lt;span style="color:#f92672"&gt;&amp;lt;/type&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;domain&lt;span style="color:#f92672"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/argument&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;format&amp;gt;&lt;/span&gt;TabSeparated&lt;span style="color:#f92672"&gt;&amp;lt;/format&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;command&amp;gt;&lt;/span&gt;icp_unitname.sh&lt;span style="color:#f92672"&gt;&amp;lt;/command&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/function&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/functions&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;创建实际被调用的脚本 &lt;code&gt;icp_unitname.sh&lt;/code&gt;，文件内容如下，并将 &lt;code&gt;icp_unitname.sh&lt;/code&gt; 存储在 &lt;code&gt;/var/lib/clickhouse/user_scripts/&lt;/code&gt; 目录下即可。&lt;/p&gt;
&lt;p&gt;实际被调用的脚本接收的参数个数和类型需要和上述添加的xml配置文件对齐。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; read domain; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	res&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;sqlite3 /data/icp &lt;span style="color:#e6db74"&gt;&amp;#34;select field3 from icp_20241202 where field2 = &amp;#39;&lt;/span&gt;$domain&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; -z &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$res&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		echo &lt;span style="color:#e6db74"&gt;&amp;#34;Unknown&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		echo $res
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;进入Clickhouse重新加载函数表并使用新增的UDF函数&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SYSTEM RELOAD FUNCTIONS # 重载函数表&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>