blob: 994acc01cceddf202e91c102c72f70a924d7d1ec [file] [log] [blame]
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title> </title>
<meta name="generator" content="VuePress 1.8.2">
<link rel="icon" href="/favicon.ico">
<meta name="description" content=" ">
<meta name="Description" content="Apache IoTDB: Time Series Database for IoT">
<meta name="Keywords" content="TSDB, time series, time series database, IoTDB, IoT database, IoT data management,时序数据库, 时间序列管理, IoTDB, 物联网数据库, 实时数据库, 物联网数据管理, 物联网数据">
<meta name="baidu-site-verification" content="wfKETzB3OT">
<meta name="google-site-verification" content="mZWAoRY0yj_HAr-s47zHCGHzx5Ju-RVm5wDbPnwQYFo">
<link rel="preload" href="/assets/css/0.styles.ccadf850.css" as="style"><link rel="preload" href="/assets/js/app.fe44b663.js" as="script"><link rel="preload" href="/assets/js/3.5626571b.js" as="script"><link rel="preload" href="/assets/js/89.fb10ca17.js" as="script"><link rel="prefetch" href="/assets/js/10.77e7d27b.js"><link rel="prefetch" href="/assets/js/100.5392026f.js"><link rel="prefetch" href="/assets/js/101.4d24dbb3.js"><link rel="prefetch" href="/assets/js/102.4db55384.js"><link rel="prefetch" href="/assets/js/103.28a00d56.js"><link rel="prefetch" href="/assets/js/104.c1cad722.js"><link rel="prefetch" href="/assets/js/105.2dbc18e7.js"><link rel="prefetch" href="/assets/js/106.03cb3598.js"><link rel="prefetch" href="/assets/js/107.1aa2e9d5.js"><link rel="prefetch" href="/assets/js/108.c8e15789.js"><link rel="prefetch" href="/assets/js/109.4e029678.js"><link rel="prefetch" href="/assets/js/11.242ea813.js"><link rel="prefetch" href="/assets/js/110.2673e754.js"><link rel="prefetch" href="/assets/js/111.99869946.js"><link rel="prefetch" href="/assets/js/112.6931e30d.js"><link rel="prefetch" href="/assets/js/113.30edd688.js"><link rel="prefetch" href="/assets/js/114.cba21417.js"><link rel="prefetch" href="/assets/js/115.36ed9d85.js"><link rel="prefetch" href="/assets/js/116.b6f26e1b.js"><link rel="prefetch" href="/assets/js/117.b7ead194.js"><link rel="prefetch" href="/assets/js/118.0489f137.js"><link rel="prefetch" href="/assets/js/119.f4531020.js"><link rel="prefetch" href="/assets/js/12.4c48405a.js"><link rel="prefetch" href="/assets/js/120.d1bc4a0d.js"><link rel="prefetch" href="/assets/js/121.c4dac7da.js"><link rel="prefetch" href="/assets/js/122.37b6650b.js"><link rel="prefetch" href="/assets/js/123.6802c679.js"><link rel="prefetch" href="/assets/js/124.3a1dcf58.js"><link rel="prefetch" href="/assets/js/125.0c3e885a.js"><link rel="prefetch" href="/assets/js/126.fbfa46eb.js"><link rel="prefetch" href="/assets/js/127.110bc389.js"><link rel="prefetch" href="/assets/js/128.fd2a9b78.js"><link rel="prefetch" href="/assets/js/129.b0669c7b.js"><link rel="prefetch" href="/assets/js/13.16ded47d.js"><link rel="prefetch" href="/assets/js/130.830f695a.js"><link rel="prefetch" href="/assets/js/131.f74784eb.js"><link rel="prefetch" href="/assets/js/132.5bd44b31.js"><link rel="prefetch" href="/assets/js/133.4871f071.js"><link rel="prefetch" href="/assets/js/134.c1ebfd44.js"><link rel="prefetch" href="/assets/js/135.06b43884.js"><link rel="prefetch" href="/assets/js/136.4125fe2d.js"><link rel="prefetch" href="/assets/js/137.f79fb732.js"><link rel="prefetch" href="/assets/js/138.925cc589.js"><link rel="prefetch" href="/assets/js/139.269b4122.js"><link rel="prefetch" href="/assets/js/14.66eebc6d.js"><link rel="prefetch" href="/assets/js/140.8acac491.js"><link rel="prefetch" href="/assets/js/141.5739ba5c.js"><link rel="prefetch" href="/assets/js/142.0a0bb60d.js"><link rel="prefetch" href="/assets/js/143.a85602a6.js"><link rel="prefetch" href="/assets/js/144.af08976e.js"><link rel="prefetch" href="/assets/js/145.54dd8613.js"><link rel="prefetch" href="/assets/js/146.d6942192.js"><link rel="prefetch" href="/assets/js/147.58b089c2.js"><link rel="prefetch" href="/assets/js/148.f3061126.js"><link rel="prefetch" href="/assets/js/149.bed18caa.js"><link rel="prefetch" href="/assets/js/15.843fe861.js"><link rel="prefetch" href="/assets/js/150.857bbcb9.js"><link rel="prefetch" href="/assets/js/151.8df8eaff.js"><link rel="prefetch" href="/assets/js/152.7fbfa55b.js"><link rel="prefetch" href="/assets/js/153.88e78e8e.js"><link rel="prefetch" href="/assets/js/154.4c0105cf.js"><link rel="prefetch" href="/assets/js/155.56c02f22.js"><link rel="prefetch" href="/assets/js/156.3610ca5b.js"><link rel="prefetch" href="/assets/js/157.a82e8d14.js"><link rel="prefetch" href="/assets/js/158.cd306550.js"><link rel="prefetch" href="/assets/js/159.7c3f6836.js"><link rel="prefetch" href="/assets/js/16.17c1f643.js"><link rel="prefetch" href="/assets/js/160.d9e7ebc3.js"><link rel="prefetch" href="/assets/js/161.f69489a3.js"><link rel="prefetch" href="/assets/js/162.260f8f8c.js"><link rel="prefetch" href="/assets/js/163.6f4c436f.js"><link rel="prefetch" href="/assets/js/164.48a2358e.js"><link rel="prefetch" href="/assets/js/165.beba59fe.js"><link rel="prefetch" href="/assets/js/166.2534a588.js"><link rel="prefetch" href="/assets/js/167.daba1492.js"><link rel="prefetch" href="/assets/js/168.66d50e2f.js"><link rel="prefetch" href="/assets/js/169.4a288ab4.js"><link rel="prefetch" href="/assets/js/17.9b8df773.js"><link rel="prefetch" href="/assets/js/170.f0555c86.js"><link rel="prefetch" href="/assets/js/171.bbe4ba1a.js"><link rel="prefetch" href="/assets/js/172.712c6bac.js"><link rel="prefetch" href="/assets/js/173.c3917d0d.js"><link rel="prefetch" href="/assets/js/174.9d843f6f.js"><link rel="prefetch" href="/assets/js/175.ca25b135.js"><link rel="prefetch" href="/assets/js/176.35f2d232.js"><link rel="prefetch" href="/assets/js/177.e8e6286d.js"><link rel="prefetch" href="/assets/js/178.c37c5efd.js"><link rel="prefetch" href="/assets/js/179.84f3bdd6.js"><link rel="prefetch" href="/assets/js/18.122d5826.js"><link rel="prefetch" href="/assets/js/180.32503609.js"><link rel="prefetch" href="/assets/js/181.219cb189.js"><link rel="prefetch" href="/assets/js/182.e90074d5.js"><link rel="prefetch" href="/assets/js/183.87f069d1.js"><link rel="prefetch" href="/assets/js/184.6b62bd9f.js"><link rel="prefetch" href="/assets/js/185.4e6b021e.js"><link rel="prefetch" href="/assets/js/186.3679d30d.js"><link rel="prefetch" href="/assets/js/187.aeba6c58.js"><link rel="prefetch" href="/assets/js/188.cc1022eb.js"><link rel="prefetch" href="/assets/js/189.5ac3b4a4.js"><link rel="prefetch" href="/assets/js/19.9187dec1.js"><link rel="prefetch" href="/assets/js/190.ff15e49f.js"><link rel="prefetch" href="/assets/js/191.369829d5.js"><link rel="prefetch" href="/assets/js/192.1d1eb36e.js"><link rel="prefetch" href="/assets/js/193.fc0fb393.js"><link rel="prefetch" href="/assets/js/194.b47fbc4c.js"><link rel="prefetch" href="/assets/js/195.9e36d668.js"><link rel="prefetch" href="/assets/js/196.2d1223f7.js"><link rel="prefetch" href="/assets/js/197.55863e11.js"><link rel="prefetch" href="/assets/js/198.a48cc095.js"><link rel="prefetch" href="/assets/js/199.3a9c2528.js"><link rel="prefetch" href="/assets/js/20.cf088c3b.js"><link rel="prefetch" href="/assets/js/200.195ff96b.js"><link rel="prefetch" href="/assets/js/201.4d6c6e24.js"><link rel="prefetch" href="/assets/js/202.c32388f7.js"><link rel="prefetch" href="/assets/js/203.080586a5.js"><link rel="prefetch" href="/assets/js/204.a3b3ce92.js"><link rel="prefetch" href="/assets/js/205.9af51d77.js"><link rel="prefetch" href="/assets/js/206.ea246089.js"><link rel="prefetch" href="/assets/js/207.1c222b6c.js"><link rel="prefetch" href="/assets/js/208.fa41b6db.js"><link rel="prefetch" href="/assets/js/209.206e9cfe.js"><link rel="prefetch" href="/assets/js/21.fd51f269.js"><link rel="prefetch" href="/assets/js/210.e4599d5b.js"><link rel="prefetch" href="/assets/js/211.b4f21019.js"><link rel="prefetch" href="/assets/js/212.552b3f7c.js"><link rel="prefetch" href="/assets/js/213.e7924e39.js"><link rel="prefetch" href="/assets/js/214.4889616d.js"><link rel="prefetch" href="/assets/js/215.8bc1d1bf.js"><link rel="prefetch" href="/assets/js/216.aeaaff79.js"><link rel="prefetch" href="/assets/js/217.51dbbd91.js"><link rel="prefetch" href="/assets/js/218.477c1e20.js"><link rel="prefetch" href="/assets/js/219.fd6ed6fa.js"><link rel="prefetch" href="/assets/js/22.f9d73f8a.js"><link rel="prefetch" href="/assets/js/220.84349773.js"><link rel="prefetch" href="/assets/js/221.4b98b09e.js"><link rel="prefetch" href="/assets/js/222.57476182.js"><link rel="prefetch" href="/assets/js/223.1c0323f8.js"><link rel="prefetch" href="/assets/js/224.61e78712.js"><link rel="prefetch" href="/assets/js/225.9b6f0752.js"><link rel="prefetch" href="/assets/js/226.4868d0a5.js"><link rel="prefetch" href="/assets/js/227.6ba50795.js"><link rel="prefetch" href="/assets/js/228.1d3cd90f.js"><link rel="prefetch" href="/assets/js/229.6ca83068.js"><link rel="prefetch" href="/assets/js/23.6c7d7eea.js"><link rel="prefetch" href="/assets/js/230.5e6f7ed2.js"><link rel="prefetch" href="/assets/js/231.a8ecd36e.js"><link rel="prefetch" href="/assets/js/232.a18567c5.js"><link rel="prefetch" href="/assets/js/233.f79fadcf.js"><link rel="prefetch" href="/assets/js/234.d9207163.js"><link rel="prefetch" href="/assets/js/235.e81b51ae.js"><link rel="prefetch" href="/assets/js/236.b9c32f41.js"><link rel="prefetch" href="/assets/js/237.d795e1ce.js"><link rel="prefetch" href="/assets/js/238.49757612.js"><link rel="prefetch" href="/assets/js/239.aeda84ea.js"><link rel="prefetch" href="/assets/js/24.a553bb19.js"><link rel="prefetch" href="/assets/js/240.07479801.js"><link rel="prefetch" href="/assets/js/241.ba1379fe.js"><link rel="prefetch" href="/assets/js/242.ce1b153f.js"><link rel="prefetch" href="/assets/js/243.18fd3c66.js"><link rel="prefetch" href="/assets/js/244.2b98e85b.js"><link rel="prefetch" href="/assets/js/245.bf64d7c9.js"><link rel="prefetch" href="/assets/js/246.d0a5b73c.js"><link rel="prefetch" href="/assets/js/247.b9bc9104.js"><link rel="prefetch" href="/assets/js/248.714df448.js"><link rel="prefetch" href="/assets/js/249.e0039e9d.js"><link rel="prefetch" href="/assets/js/25.1e42b275.js"><link rel="prefetch" href="/assets/js/250.ca664993.js"><link rel="prefetch" href="/assets/js/251.b47f298a.js"><link rel="prefetch" href="/assets/js/252.71392152.js"><link rel="prefetch" href="/assets/js/253.e0f23ec8.js"><link rel="prefetch" href="/assets/js/254.6d43bbe7.js"><link rel="prefetch" href="/assets/js/255.c1779bd2.js"><link rel="prefetch" href="/assets/js/256.6a8a06f3.js"><link rel="prefetch" href="/assets/js/257.4e74c883.js"><link rel="prefetch" href="/assets/js/258.f4b72fd8.js"><link rel="prefetch" href="/assets/js/259.f9b80571.js"><link rel="prefetch" href="/assets/js/26.0057d37b.js"><link rel="prefetch" href="/assets/js/260.10e21bfc.js"><link rel="prefetch" href="/assets/js/261.402db160.js"><link rel="prefetch" href="/assets/js/262.02c5372b.js"><link rel="prefetch" href="/assets/js/263.3454f741.js"><link rel="prefetch" href="/assets/js/264.dfc588bd.js"><link rel="prefetch" href="/assets/js/265.f1fee64b.js"><link rel="prefetch" href="/assets/js/266.baac44a1.js"><link rel="prefetch" href="/assets/js/267.b6f584a5.js"><link rel="prefetch" href="/assets/js/268.013f92f7.js"><link rel="prefetch" href="/assets/js/269.706a27e5.js"><link rel="prefetch" href="/assets/js/27.9e25f953.js"><link rel="prefetch" href="/assets/js/270.397dc6f7.js"><link rel="prefetch" href="/assets/js/271.5f063e14.js"><link rel="prefetch" href="/assets/js/272.b88b9e6e.js"><link rel="prefetch" href="/assets/js/273.f7eeeb80.js"><link rel="prefetch" href="/assets/js/274.8d7d8c2a.js"><link rel="prefetch" href="/assets/js/275.167633d2.js"><link rel="prefetch" href="/assets/js/276.bf42d85f.js"><link rel="prefetch" href="/assets/js/277.195beb55.js"><link rel="prefetch" href="/assets/js/278.852d1996.js"><link rel="prefetch" href="/assets/js/279.a3fb5857.js"><link rel="prefetch" href="/assets/js/28.0a801078.js"><link rel="prefetch" href="/assets/js/280.de229c1d.js"><link rel="prefetch" href="/assets/js/281.47d676fa.js"><link rel="prefetch" href="/assets/js/282.1db3920a.js"><link rel="prefetch" href="/assets/js/283.0ed31a9c.js"><link rel="prefetch" href="/assets/js/284.d2f802aa.js"><link rel="prefetch" href="/assets/js/285.0a18923e.js"><link rel="prefetch" href="/assets/js/286.60438a30.js"><link rel="prefetch" href="/assets/js/287.6fa63573.js"><link rel="prefetch" href="/assets/js/288.4432c980.js"><link rel="prefetch" href="/assets/js/289.789f44e7.js"><link rel="prefetch" href="/assets/js/29.a31435b1.js"><link rel="prefetch" href="/assets/js/290.3c1f2e4c.js"><link rel="prefetch" href="/assets/js/291.a340398b.js"><link rel="prefetch" href="/assets/js/292.8568adc1.js"><link rel="prefetch" href="/assets/js/293.42107ac0.js"><link rel="prefetch" href="/assets/js/294.5fae363a.js"><link rel="prefetch" href="/assets/js/295.eb955643.js"><link rel="prefetch" href="/assets/js/296.77ae03d2.js"><link rel="prefetch" href="/assets/js/297.e548ba7e.js"><link rel="prefetch" href="/assets/js/298.d08bd092.js"><link rel="prefetch" href="/assets/js/299.a9495179.js"><link rel="prefetch" href="/assets/js/30.60649b66.js"><link rel="prefetch" href="/assets/js/300.1f1c6539.js"><link rel="prefetch" href="/assets/js/301.45e54d01.js"><link rel="prefetch" href="/assets/js/302.41fa5b16.js"><link rel="prefetch" href="/assets/js/303.50302303.js"><link rel="prefetch" href="/assets/js/304.45ec5f49.js"><link rel="prefetch" href="/assets/js/305.4667a075.js"><link rel="prefetch" href="/assets/js/306.9adbbd88.js"><link rel="prefetch" href="/assets/js/307.01fbd282.js"><link rel="prefetch" href="/assets/js/308.ee661372.js"><link rel="prefetch" href="/assets/js/309.71fd6514.js"><link rel="prefetch" href="/assets/js/31.b5e715ce.js"><link rel="prefetch" href="/assets/js/310.2c1b5f58.js"><link rel="prefetch" href="/assets/js/311.bf369b6f.js"><link rel="prefetch" href="/assets/js/312.ee6deb53.js"><link rel="prefetch" href="/assets/js/313.b173305e.js"><link rel="prefetch" href="/assets/js/314.9bf7681c.js"><link rel="prefetch" href="/assets/js/315.9dced4c4.js"><link rel="prefetch" href="/assets/js/316.d1625f8e.js"><link rel="prefetch" href="/assets/js/317.ff874148.js"><link rel="prefetch" href="/assets/js/318.bc83f98a.js"><link rel="prefetch" href="/assets/js/319.eb7b75c1.js"><link rel="prefetch" href="/assets/js/32.e5e702b0.js"><link rel="prefetch" href="/assets/js/320.017cca1c.js"><link rel="prefetch" href="/assets/js/321.e34387cb.js"><link rel="prefetch" href="/assets/js/322.5aae6989.js"><link rel="prefetch" href="/assets/js/323.e4fd51b3.js"><link rel="prefetch" href="/assets/js/324.1ba3ee32.js"><link rel="prefetch" href="/assets/js/325.21254638.js"><link rel="prefetch" href="/assets/js/326.377d3f46.js"><link rel="prefetch" href="/assets/js/327.7734ba1d.js"><link rel="prefetch" href="/assets/js/328.e9791163.js"><link rel="prefetch" href="/assets/js/329.8acd00bc.js"><link rel="prefetch" href="/assets/js/33.b678d537.js"><link rel="prefetch" href="/assets/js/330.6cff02ec.js"><link rel="prefetch" href="/assets/js/331.98ebbe7d.js"><link rel="prefetch" href="/assets/js/332.1d9d1a04.js"><link rel="prefetch" href="/assets/js/333.e8be9a85.js"><link rel="prefetch" href="/assets/js/334.677f7d89.js"><link rel="prefetch" href="/assets/js/335.9bca2b37.js"><link rel="prefetch" href="/assets/js/336.b2a7394a.js"><link rel="prefetch" href="/assets/js/337.0231a5b2.js"><link rel="prefetch" href="/assets/js/338.1979cb4d.js"><link rel="prefetch" href="/assets/js/339.4bb8f0a9.js"><link rel="prefetch" href="/assets/js/34.f1aa3803.js"><link rel="prefetch" href="/assets/js/340.f0fa3c52.js"><link rel="prefetch" href="/assets/js/341.f8178251.js"><link rel="prefetch" href="/assets/js/342.7dd47706.js"><link rel="prefetch" href="/assets/js/343.363f2cae.js"><link rel="prefetch" href="/assets/js/344.2b4d1572.js"><link rel="prefetch" href="/assets/js/345.54e08f16.js"><link rel="prefetch" href="/assets/js/346.541ef94e.js"><link rel="prefetch" href="/assets/js/347.1f8a56e7.js"><link rel="prefetch" href="/assets/js/348.ff08d1b4.js"><link rel="prefetch" href="/assets/js/349.97e1160f.js"><link rel="prefetch" href="/assets/js/35.5612ab6a.js"><link rel="prefetch" href="/assets/js/350.1fa64f48.js"><link rel="prefetch" href="/assets/js/351.0cdcbb68.js"><link rel="prefetch" href="/assets/js/352.04f35660.js"><link rel="prefetch" href="/assets/js/353.c63abb11.js"><link rel="prefetch" href="/assets/js/354.f07fe232.js"><link rel="prefetch" href="/assets/js/355.9db8e984.js"><link rel="prefetch" href="/assets/js/356.7e54a7f7.js"><link rel="prefetch" href="/assets/js/357.b8b2c19a.js"><link rel="prefetch" href="/assets/js/358.ec88593c.js"><link rel="prefetch" href="/assets/js/359.57a348e6.js"><link rel="prefetch" href="/assets/js/36.4e36f97e.js"><link rel="prefetch" href="/assets/js/360.f91d4985.js"><link rel="prefetch" href="/assets/js/361.fd0b896b.js"><link rel="prefetch" href="/assets/js/362.3078bc4c.js"><link rel="prefetch" href="/assets/js/363.970af9b1.js"><link rel="prefetch" href="/assets/js/364.ce305e49.js"><link rel="prefetch" href="/assets/js/365.228a2005.js"><link rel="prefetch" href="/assets/js/366.3e0ce2e8.js"><link rel="prefetch" href="/assets/js/367.dfba61c0.js"><link rel="prefetch" href="/assets/js/368.d4307f98.js"><link rel="prefetch" href="/assets/js/369.730e7097.js"><link rel="prefetch" href="/assets/js/37.13b65e5d.js"><link rel="prefetch" href="/assets/js/370.e7a52728.js"><link rel="prefetch" href="/assets/js/371.99346247.js"><link rel="prefetch" href="/assets/js/372.09676253.js"><link rel="prefetch" href="/assets/js/373.2a7b274a.js"><link rel="prefetch" href="/assets/js/374.e347ead4.js"><link rel="prefetch" href="/assets/js/375.f70bcedd.js"><link rel="prefetch" href="/assets/js/376.c776b0ed.js"><link rel="prefetch" href="/assets/js/377.3d81f722.js"><link rel="prefetch" href="/assets/js/378.a7f10c5f.js"><link rel="prefetch" href="/assets/js/379.b18f1c51.js"><link rel="prefetch" href="/assets/js/38.c6f83038.js"><link rel="prefetch" href="/assets/js/380.a84e788a.js"><link rel="prefetch" href="/assets/js/381.521f1a2b.js"><link rel="prefetch" href="/assets/js/382.10ebffdc.js"><link rel="prefetch" href="/assets/js/383.fa0c4858.js"><link rel="prefetch" href="/assets/js/384.4d3a1d3e.js"><link rel="prefetch" href="/assets/js/385.edbe545d.js"><link rel="prefetch" href="/assets/js/386.aa0e0479.js"><link rel="prefetch" href="/assets/js/387.d08b9da1.js"><link rel="prefetch" href="/assets/js/388.3cafa76f.js"><link rel="prefetch" href="/assets/js/389.1c150739.js"><link rel="prefetch" href="/assets/js/39.41707d32.js"><link rel="prefetch" href="/assets/js/390.e3c6dc5b.js"><link rel="prefetch" href="/assets/js/391.097ce5d5.js"><link rel="prefetch" href="/assets/js/392.b1450deb.js"><link rel="prefetch" href="/assets/js/393.a9be5042.js"><link rel="prefetch" href="/assets/js/394.0f496e89.js"><link rel="prefetch" href="/assets/js/395.d66b20d2.js"><link rel="prefetch" href="/assets/js/396.a238eb17.js"><link rel="prefetch" href="/assets/js/397.c76a0b8d.js"><link rel="prefetch" href="/assets/js/398.3812b640.js"><link rel="prefetch" href="/assets/js/399.e6940f90.js"><link rel="prefetch" href="/assets/js/4.9c4b1c6d.js"><link rel="prefetch" href="/assets/js/40.f82f0187.js"><link rel="prefetch" href="/assets/js/400.5e0cfb93.js"><link rel="prefetch" href="/assets/js/401.f613f2ba.js"><link rel="prefetch" href="/assets/js/402.be1f5783.js"><link rel="prefetch" href="/assets/js/403.33c1396d.js"><link rel="prefetch" href="/assets/js/404.562089b0.js"><link rel="prefetch" href="/assets/js/405.93f42baf.js"><link rel="prefetch" href="/assets/js/406.ba8d00d1.js"><link rel="prefetch" href="/assets/js/407.0150b19f.js"><link rel="prefetch" href="/assets/js/408.728a1d15.js"><link rel="prefetch" href="/assets/js/409.ef560ed7.js"><link rel="prefetch" href="/assets/js/41.b6799c44.js"><link rel="prefetch" href="/assets/js/410.d3f65621.js"><link rel="prefetch" href="/assets/js/411.07ef2c9f.js"><link rel="prefetch" href="/assets/js/412.4a1d8057.js"><link rel="prefetch" href="/assets/js/413.ebf9aafc.js"><link rel="prefetch" href="/assets/js/414.a5433120.js"><link rel="prefetch" href="/assets/js/415.4dcc07c7.js"><link rel="prefetch" href="/assets/js/416.11747f6b.js"><link rel="prefetch" href="/assets/js/417.5270e086.js"><link rel="prefetch" href="/assets/js/418.d5fc9d05.js"><link rel="prefetch" href="/assets/js/419.540dcd2a.js"><link rel="prefetch" href="/assets/js/42.e6b0aae2.js"><link rel="prefetch" href="/assets/js/420.28641617.js"><link rel="prefetch" href="/assets/js/421.a6c3c8af.js"><link rel="prefetch" href="/assets/js/422.52ab97a6.js"><link rel="prefetch" href="/assets/js/423.7c5da32e.js"><link rel="prefetch" href="/assets/js/424.d39b15e0.js"><link rel="prefetch" href="/assets/js/425.2c8fbc5a.js"><link rel="prefetch" href="/assets/js/426.b6957825.js"><link rel="prefetch" href="/assets/js/427.b96cf924.js"><link rel="prefetch" href="/assets/js/428.6440b235.js"><link rel="prefetch" href="/assets/js/429.57902fe0.js"><link rel="prefetch" href="/assets/js/43.3fff5a4c.js"><link rel="prefetch" href="/assets/js/430.04255b2f.js"><link rel="prefetch" href="/assets/js/431.321286eb.js"><link rel="prefetch" href="/assets/js/432.72fdf31f.js"><link rel="prefetch" href="/assets/js/433.52676bc7.js"><link rel="prefetch" href="/assets/js/434.7bc3fee7.js"><link rel="prefetch" href="/assets/js/435.deac35a6.js"><link rel="prefetch" href="/assets/js/436.46f753f4.js"><link rel="prefetch" href="/assets/js/437.6a675a68.js"><link rel="prefetch" href="/assets/js/438.e8c8ae5b.js"><link rel="prefetch" href="/assets/js/439.ba3f2700.js"><link rel="prefetch" href="/assets/js/44.fee39d6b.js"><link rel="prefetch" href="/assets/js/440.98a7bff0.js"><link rel="prefetch" href="/assets/js/441.e12292fb.js"><link rel="prefetch" href="/assets/js/442.08f60114.js"><link rel="prefetch" href="/assets/js/443.d5d255b9.js"><link rel="prefetch" href="/assets/js/444.01c13452.js"><link rel="prefetch" href="/assets/js/445.954c3b0b.js"><link rel="prefetch" href="/assets/js/446.81521199.js"><link rel="prefetch" href="/assets/js/447.0cf2269e.js"><link rel="prefetch" href="/assets/js/448.fb62b763.js"><link rel="prefetch" href="/assets/js/449.2fd7ec4e.js"><link rel="prefetch" href="/assets/js/45.244b7680.js"><link rel="prefetch" href="/assets/js/450.3ff3ce7b.js"><link rel="prefetch" href="/assets/js/451.4b455f4a.js"><link rel="prefetch" href="/assets/js/452.51fbf6e4.js"><link rel="prefetch" href="/assets/js/453.4d5d4319.js"><link rel="prefetch" href="/assets/js/454.99948bc3.js"><link rel="prefetch" href="/assets/js/455.d1380266.js"><link rel="prefetch" href="/assets/js/456.22423caf.js"><link rel="prefetch" href="/assets/js/457.05a6e43b.js"><link rel="prefetch" href="/assets/js/458.2a93e9bc.js"><link rel="prefetch" href="/assets/js/459.dfc3d492.js"><link rel="prefetch" href="/assets/js/46.539f062d.js"><link rel="prefetch" href="/assets/js/460.2a50d5c4.js"><link rel="prefetch" href="/assets/js/461.07548ac3.js"><link rel="prefetch" href="/assets/js/462.214e91ce.js"><link rel="prefetch" href="/assets/js/463.414bc138.js"><link rel="prefetch" href="/assets/js/464.779a26ec.js"><link rel="prefetch" href="/assets/js/465.c61d57fa.js"><link rel="prefetch" href="/assets/js/466.ab4c1900.js"><link rel="prefetch" href="/assets/js/467.6398c8fc.js"><link rel="prefetch" href="/assets/js/468.f013763e.js"><link rel="prefetch" href="/assets/js/469.40bcf372.js"><link rel="prefetch" href="/assets/js/47.a8742825.js"><link rel="prefetch" href="/assets/js/470.ba1d5a08.js"><link rel="prefetch" href="/assets/js/471.9842c3d9.js"><link rel="prefetch" href="/assets/js/472.887667b1.js"><link rel="prefetch" href="/assets/js/473.ac9f4dc8.js"><link rel="prefetch" href="/assets/js/474.c950558a.js"><link rel="prefetch" href="/assets/js/475.ec6929d7.js"><link rel="prefetch" href="/assets/js/476.d351ffef.js"><link rel="prefetch" href="/assets/js/477.cbb436f4.js"><link rel="prefetch" href="/assets/js/478.10a8af05.js"><link rel="prefetch" href="/assets/js/479.3e21eec2.js"><link rel="prefetch" href="/assets/js/48.656f2900.js"><link rel="prefetch" href="/assets/js/480.2889f790.js"><link rel="prefetch" href="/assets/js/481.6504abc3.js"><link rel="prefetch" href="/assets/js/482.25c23f5a.js"><link rel="prefetch" href="/assets/js/483.11c430e0.js"><link rel="prefetch" href="/assets/js/484.4fb1d507.js"><link rel="prefetch" href="/assets/js/485.1ecbb4e0.js"><link rel="prefetch" href="/assets/js/486.a15cc699.js"><link rel="prefetch" href="/assets/js/487.b4a9526d.js"><link rel="prefetch" href="/assets/js/488.85d13879.js"><link rel="prefetch" href="/assets/js/489.3a566e3d.js"><link rel="prefetch" href="/assets/js/49.f271ac34.js"><link rel="prefetch" href="/assets/js/490.347d23af.js"><link rel="prefetch" href="/assets/js/491.558b7aa9.js"><link rel="prefetch" href="/assets/js/492.af9c4c53.js"><link rel="prefetch" href="/assets/js/493.f89bdb3c.js"><link rel="prefetch" href="/assets/js/494.a0142c98.js"><link rel="prefetch" href="/assets/js/495.d3de8850.js"><link rel="prefetch" href="/assets/js/496.d48c6630.js"><link rel="prefetch" href="/assets/js/497.3b9635e2.js"><link rel="prefetch" href="/assets/js/498.f587a80e.js"><link rel="prefetch" href="/assets/js/499.22f6be18.js"><link rel="prefetch" href="/assets/js/5.2a4451ec.js"><link rel="prefetch" href="/assets/js/50.7d8944cd.js"><link rel="prefetch" href="/assets/js/500.d054de5c.js"><link rel="prefetch" href="/assets/js/501.954e1b5c.js"><link rel="prefetch" href="/assets/js/502.4b184e51.js"><link rel="prefetch" href="/assets/js/503.10334ca5.js"><link rel="prefetch" href="/assets/js/504.0e074cd3.js"><link rel="prefetch" href="/assets/js/505.4993e90d.js"><link rel="prefetch" href="/assets/js/506.6f94a2f8.js"><link rel="prefetch" href="/assets/js/507.b255fcfd.js"><link rel="prefetch" href="/assets/js/508.95c9551e.js"><link rel="prefetch" href="/assets/js/509.1d2ab0fb.js"><link rel="prefetch" href="/assets/js/51.fd01b1a1.js"><link rel="prefetch" href="/assets/js/510.36c66e50.js"><link rel="prefetch" href="/assets/js/511.caf2e589.js"><link rel="prefetch" href="/assets/js/512.133bca04.js"><link rel="prefetch" href="/assets/js/513.e3f62ca2.js"><link rel="prefetch" href="/assets/js/514.f17c4a44.js"><link rel="prefetch" href="/assets/js/515.f637b155.js"><link rel="prefetch" href="/assets/js/516.3cccca96.js"><link rel="prefetch" href="/assets/js/517.80c43b59.js"><link rel="prefetch" href="/assets/js/518.f3438412.js"><link rel="prefetch" href="/assets/js/519.5a0ef98b.js"><link rel="prefetch" href="/assets/js/52.10d8a15b.js"><link rel="prefetch" href="/assets/js/520.d83038f1.js"><link rel="prefetch" href="/assets/js/521.4726d233.js"><link rel="prefetch" href="/assets/js/522.045aff30.js"><link rel="prefetch" href="/assets/js/523.9d9b45b5.js"><link rel="prefetch" href="/assets/js/524.86a7c6cf.js"><link rel="prefetch" href="/assets/js/525.1d6e7b79.js"><link rel="prefetch" href="/assets/js/526.c365bd67.js"><link rel="prefetch" href="/assets/js/527.555f8b61.js"><link rel="prefetch" href="/assets/js/528.690272cc.js"><link rel="prefetch" href="/assets/js/529.7f05b847.js"><link rel="prefetch" href="/assets/js/53.79f66cea.js"><link rel="prefetch" href="/assets/js/530.3fb31398.js"><link rel="prefetch" href="/assets/js/531.54b0ee66.js"><link rel="prefetch" href="/assets/js/532.42a967ca.js"><link rel="prefetch" href="/assets/js/54.1ec48dc5.js"><link rel="prefetch" href="/assets/js/55.9d4b8667.js"><link rel="prefetch" href="/assets/js/56.aa94202c.js"><link rel="prefetch" href="/assets/js/57.dd80489d.js"><link rel="prefetch" href="/assets/js/58.9af3c40d.js"><link rel="prefetch" href="/assets/js/59.70e0291b.js"><link rel="prefetch" href="/assets/js/6.3450075a.js"><link rel="prefetch" href="/assets/js/60.53b7d88b.js"><link rel="prefetch" href="/assets/js/61.b70ccd57.js"><link rel="prefetch" href="/assets/js/62.eef65e9b.js"><link rel="prefetch" href="/assets/js/63.3a66528e.js"><link rel="prefetch" href="/assets/js/64.ed6b77b6.js"><link rel="prefetch" href="/assets/js/65.5573ce3d.js"><link rel="prefetch" href="/assets/js/66.aa4ead2c.js"><link rel="prefetch" href="/assets/js/67.29edf638.js"><link rel="prefetch" href="/assets/js/68.38ac76fc.js"><link rel="prefetch" href="/assets/js/69.7f8c7118.js"><link rel="prefetch" href="/assets/js/7.c5c54fb4.js"><link rel="prefetch" href="/assets/js/70.368e2128.js"><link rel="prefetch" href="/assets/js/71.cf483d39.js"><link rel="prefetch" href="/assets/js/72.b095c9c5.js"><link rel="prefetch" href="/assets/js/73.7f2ffe57.js"><link rel="prefetch" href="/assets/js/74.d67c3927.js"><link rel="prefetch" href="/assets/js/75.d4945299.js"><link rel="prefetch" href="/assets/js/76.f01b8b07.js"><link rel="prefetch" href="/assets/js/77.3c1e294c.js"><link rel="prefetch" href="/assets/js/78.cfcd53d4.js"><link rel="prefetch" href="/assets/js/79.a50c96bd.js"><link rel="prefetch" href="/assets/js/8.68d2fe5c.js"><link rel="prefetch" href="/assets/js/80.8358bd99.js"><link rel="prefetch" href="/assets/js/81.754e7cd2.js"><link rel="prefetch" href="/assets/js/82.e42aff88.js"><link rel="prefetch" href="/assets/js/83.152a1582.js"><link rel="prefetch" href="/assets/js/84.4867883c.js"><link rel="prefetch" href="/assets/js/85.6b2afa69.js"><link rel="prefetch" href="/assets/js/86.3e058a7a.js"><link rel="prefetch" href="/assets/js/87.cf9a4fcf.js"><link rel="prefetch" href="/assets/js/88.dc32204f.js"><link rel="prefetch" href="/assets/js/9.e4a451d3.js"><link rel="prefetch" href="/assets/js/90.7f184d9a.js"><link rel="prefetch" href="/assets/js/91.35f464f6.js"><link rel="prefetch" href="/assets/js/92.e45a3d68.js"><link rel="prefetch" href="/assets/js/93.0d192890.js"><link rel="prefetch" href="/assets/js/94.13f91cee.js"><link rel="prefetch" href="/assets/js/95.732898b6.js"><link rel="prefetch" href="/assets/js/96.10bfabc4.js"><link rel="prefetch" href="/assets/js/97.20f5d113.js"><link rel="prefetch" href="/assets/js/98.49efa8b4.js"><link rel="prefetch" href="/assets/js/99.9abce7a4.js"><link rel="prefetch" href="/assets/js/vendors~docsearch.eff714eb.js">
<link rel="stylesheet" href="/assets/css/0.styles.ccadf850.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><img src="/img/logo.png" alt=" " class="logo"></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Document</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/UserGuide/Master/Get Started/QuickStart.html" class="nav-link">In progress</a></li><li class="dropdown-item"><!----> <a href="/UserGuide/V0.11.x/Get Started/QuickStart.html" class="nav-link">V0.11.x</a></li><li class="dropdown-item"><!----> <a href="/UserGuide/V0.10.x/Get Started/QuickStart.html" class="nav-link">V0.10.x</a></li><li class="dropdown-item"><!----> <a href="/UserGuide/V0.9.x/0-Get Started/1-QuickStart.html" class="nav-link">V0.9.x</a></li><li class="dropdown-item"><!----> <a href="/UserGuide/V0.8.x/0-Get Started/1-QuickStart.html" class="nav-link">V0.8.x</a></li></ul></div></div><div class="nav-item"><a href="/SystemDesign/Architecture/Architecture.html" class="nav-link">System design</a></div><div class="nav-item"><a href="/Download/" class="nav-link">Download</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Community</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="https://cwiki.apache.org/confluence/display/iotdb" class="nav-link external">
Wiki
<!----></a></li><li class="dropdown-item"><!----> <a href="/Community/Community-Project Committers.html" class="nav-link">People</a></li><li class="dropdown-item"><!----> <a href="/Community/Community-Powered By.html" class="nav-link">Powered By</a></li><li class="dropdown-item"><!----> <a href="/Community/Materials.html" class="nav-link">Resources</a></li><li class="dropdown-item"><!----> <a href="/Community/Feedback.html" class="nav-link">Feedback</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Development</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/Development/VoteRelease.html" class="nav-link">How to vote</a></li><li class="dropdown-item"><!----> <a href="/Development/HowToCommit.html" class="nav-link">How to Commit</a></li><li class="dropdown-item"><!----> <a href="/Development/Committer.html" class="nav-link">Become a Committer</a></li><li class="dropdown-item"><!----> <a href="/Development/ContributeGuide.html" class="nav-link">ContributeGuide</a></li><li class="dropdown-item"><!----> <a href="/Development/format-changelist.html" class="nav-link">Changelist of TsFile</a></li><li class="dropdown-item"><!----> <a href="/Development/rpc-changelist.html" class="nav-link">Changelist of RPC</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Blog</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/Blog/Index.html" class="nav-link">Overview</a></li><li class="dropdown-item"><!----> <a href="/Blog/Release0_93.html" class="nav-link">Some Notes on Release 0.9.3 and upcoming 0.10.0</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">ASF</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="http://www.apache.org/" class="nav-link external">
Foundation
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/licenses/" class="nav-link external">
License
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/security/" class="nav-link external">
Security
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/foundation/sponsorship.html" class="nav-link external">
Sponsorship
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/foundation/thanks.html" class="nav-link external">
Thanks
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/events/current-event" class="nav-link external">
Current Events
<!----></a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Languages</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/UserGuide/Master/Operation Manual/UDF User Defined Function.html" class="nav-link">English</a></li><li class="dropdown-item"><!----> <a href="/zh/UserGuide/Master/Operation Manual/UDF User Defined Function.html" class="nav-link">简体中文</a></li></ul></div></div> <a href="https://github.com/apache/iotdb.git" target="_blank" rel="noopener noreferrer" class="repo-link">
gitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Document</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/UserGuide/Master/Get Started/QuickStart.html" class="nav-link">In progress</a></li><li class="dropdown-item"><!----> <a href="/UserGuide/V0.11.x/Get Started/QuickStart.html" class="nav-link">V0.11.x</a></li><li class="dropdown-item"><!----> <a href="/UserGuide/V0.10.x/Get Started/QuickStart.html" class="nav-link">V0.10.x</a></li><li class="dropdown-item"><!----> <a href="/UserGuide/V0.9.x/0-Get Started/1-QuickStart.html" class="nav-link">V0.9.x</a></li><li class="dropdown-item"><!----> <a href="/UserGuide/V0.8.x/0-Get Started/1-QuickStart.html" class="nav-link">V0.8.x</a></li></ul></div></div><div class="nav-item"><a href="/SystemDesign/Architecture/Architecture.html" class="nav-link">System design</a></div><div class="nav-item"><a href="/Download/" class="nav-link">Download</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Community</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="https://cwiki.apache.org/confluence/display/iotdb" class="nav-link external">
Wiki
<!----></a></li><li class="dropdown-item"><!----> <a href="/Community/Community-Project Committers.html" class="nav-link">People</a></li><li class="dropdown-item"><!----> <a href="/Community/Community-Powered By.html" class="nav-link">Powered By</a></li><li class="dropdown-item"><!----> <a href="/Community/Materials.html" class="nav-link">Resources</a></li><li class="dropdown-item"><!----> <a href="/Community/Feedback.html" class="nav-link">Feedback</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Development</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/Development/VoteRelease.html" class="nav-link">How to vote</a></li><li class="dropdown-item"><!----> <a href="/Development/HowToCommit.html" class="nav-link">How to Commit</a></li><li class="dropdown-item"><!----> <a href="/Development/Committer.html" class="nav-link">Become a Committer</a></li><li class="dropdown-item"><!----> <a href="/Development/ContributeGuide.html" class="nav-link">ContributeGuide</a></li><li class="dropdown-item"><!----> <a href="/Development/format-changelist.html" class="nav-link">Changelist of TsFile</a></li><li class="dropdown-item"><!----> <a href="/Development/rpc-changelist.html" class="nav-link">Changelist of RPC</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Blog</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/Blog/Index.html" class="nav-link">Overview</a></li><li class="dropdown-item"><!----> <a href="/Blog/Release0_93.html" class="nav-link">Some Notes on Release 0.9.3 and upcoming 0.10.0</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">ASF</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="http://www.apache.org/" class="nav-link external">
Foundation
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/licenses/" class="nav-link external">
License
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/security/" class="nav-link external">
Security
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/foundation/sponsorship.html" class="nav-link external">
Sponsorship
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/foundation/thanks.html" class="nav-link external">
Thanks
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/events/current-event" class="nav-link external">
Current Events
<!----></a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Languages</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/UserGuide/Master/Operation Manual/UDF User Defined Function.html" class="nav-link">English</a></li><li class="dropdown-item"><!----> <a href="/zh/UserGuide/Master/Operation Manual/UDF User Defined Function.html" class="nav-link">简体中文</a></li></ul></div></div> <a href="https://github.com/apache/iotdb.git" target="_blank" rel="noopener noreferrer" class="repo-link">
gitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>IoTDB User Guide (In progress)</span> <!----></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Get Started</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Overview</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Concept</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Server</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Client</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading open"><span>Operation Manual</span> <span class="arrow down"></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/UserGuide/Master/Operation Manual/DDL Data Definition Language.html" class="sidebar-link">DDL (Data Definition Language)</a></li><li><a href="/UserGuide/Master/Operation Manual/DML Data Manipulation Language.html" class="sidebar-link">DML (Data Manipulation Language)</a></li><li><a href="/UserGuide/Master/Operation Manual/UDF User Defined Function.html" class="active sidebar-link">UDF (User Defined Function)</a></li><li><a href="/UserGuide/Master/Operation Manual/Kill Query.html" class="sidebar-link">Kill Query</a></li><li><a href="/UserGuide/Master/Operation Manual/Administration.html" class="sidebar-link">Administration</a></li><li><a href="/UserGuide/Master/Operation Manual/SQL Reference.html" class="sidebar-link">SQL Reference</a></li></ul></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>System Tools</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Ecosystem Integration</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Architecture</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Comparison with TSDBs</span> <span class="arrow right"></span></p> <!----></section></li></ul> </aside> <main class="page"> <div class="content content__default"><h1 id="udf-user-defined-function"><a href="#udf-user-defined-function" class="header-anchor">#</a> UDF (User Defined Function)</h1> <p>IoTDB provides a variety of built-in functions to meet your computing needs, and you can also create user defined functions to meet more computing needs.</p> <p>This document describes how to write, register and use a UDF.</p> <h2 id="udf-types"><a href="#udf-types" class="header-anchor">#</a> UDF Types</h2> <p>In IoTDB, you can expand two types of UDF:</p> <table><thead><tr><th>UDF Class</th> <th>Description</th></tr></thead> <tbody><tr><td>UDTF(User Defined Timeseries Generating Function)</td> <td>This type of function can take <strong>multiple</strong> time series as input, and output <strong>one</strong> time series, which can have any number of data points.</td></tr> <tr><td>UDAF(User Defined Aggregation Function)</td> <td>Under development, please stay tuned.</td></tr></tbody></table> <h2 id="udf-development-dependencies"><a href="#udf-development-dependencies" class="header-anchor">#</a> UDF Development Dependencies</h2> <p>If you use <a href="http://search.maven.org/" target="_blank" rel="noopener noreferrer">Maven<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>, you can search for the development dependencies listed below from the <a href="http://search.maven.org/" target="_blank" rel="noopener noreferrer">Maven repository<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> . Please note that you must select the same dependency version as the target IoTDB server version for development.</p> <div class="language-xml line-numbers-mode"><pre class="language-xml"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.apache.iotdb<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>iotdb-server<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>version</span><span class="token punctuation">&gt;</span></span>0.12.0-SNAPSHOT<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>version</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>scope</span><span class="token punctuation">&gt;</span></span>provided<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>scope</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><h2 id="udtf-user-defined-timeseries-generating-function"><a href="#udtf-user-defined-timeseries-generating-function" class="header-anchor">#</a> UDTF(User Defined Timeseries Generating Function)</h2> <p>To write a UDTF, you need to inherit the <code>org.apache.iotdb.db.query.udf.api.UDTF</code> class, and at least implement the <code>beforeStart</code> method and a <code>transform</code> method.</p> <p>The following table shows all the interfaces available for user implementation.</p> <table><thead><tr><th style="text-align:left;">Interface definition</th> <th style="text-align:left;">Description</th> <th>Required to Implement</th></tr></thead> <tbody><tr><td style="text-align:left;"><code>void validate(UDFParameterValidator validator) throws Exception</code></td> <td style="text-align:left;">This method is mainly used to validate <code>UDFParameters</code> and it is executed before <code>beforeStart(UDFParameters, UDTFConfigurations)</code> is called.</td> <td>Optional</td></tr> <tr><td style="text-align:left;"><code>void beforeStart(UDFParameters parameters, UDTFConfigurations configurations) throws Exception</code></td> <td style="text-align:left;">The initialization method to call the user-defined initialization behavior before a UDTF processes the input data. Every time a user executes a UDTF query, the framework will construct a new UDF instance, and <code>beforeStart</code> will be called.</td> <td>Required</td></tr> <tr><td style="text-align:left;"><code>void transform(Row row, PointCollector collector) throws Exception</code></td> <td style="text-align:left;">This method is called by the framework. This data processing method will be called when you choose to use the <code>RowByRowAccessStrategy</code> strategy (set in <code>beforeStart</code>) to consume raw data. Input data is passed in by <code>Row</code>, and the transformation result should be output by <code>PointCollector</code>. You need to call the data collection method provided by <code>collector</code> to determine the output data.</td> <td>Required to implement at least one <code>transform</code> method</td></tr> <tr><td style="text-align:left;"><code>void transform(RowWindow rowWindow, PointCollector collector) throws Exception</code></td> <td style="text-align:left;">This method is called by the framework. This data processing method will be called when you choose to use the <code>SlidingSizeWindowAccessStrategy</code> or <code>SlidingTimeWindowAccessStrategy</code> strategy (set in <code>beforeStart</code>) to consume raw data. Input data is passed in by <code>RowWindow</code>, and the transformation result should be output by <code>PointCollector</code>. You need to call the data collection method provided by <code>collector</code> to determine the output data.</td> <td>Required to implement at least one <code>transform</code> method</td></tr> <tr><td style="text-align:left;"><code>void terminate(PointCollector collector) throws Exception</code></td> <td style="text-align:left;">This method is called by the framework. This method will be called once after all <code>transform</code> calls have been executed. In a single UDF query, this method will and will only be called once. You need to call the data collection method provided by <code>collector</code> to determine the output data.</td> <td>Optional</td></tr> <tr><td style="text-align:left;"><code>void beforeDestroy()</code></td> <td style="text-align:left;">This method is called by the framework after the last input data is processed, and will only be called once in the life cycle of each UDF instance.</td> <td>Optional</td></tr></tbody></table> <p>In the life cycle of a UDTF instance, the calling sequence of each method is as follows:</p> <ol><li><code>void validate(UDFParameterValidator validator) throws Exception</code></li> <li><code>void beforeStart(UDFParameters parameters, UDTFConfigurations configurations) throws Exception</code></li> <li><code>void transform(Row row, PointCollector collector) throws Exception</code> or <code>void transform(RowWindow rowWindow, PointCollector collector) throws Exception</code></li> <li><code>void terminate(PointCollector collector) throws Exception</code></li> <li><code>void beforeDestroy()</code></li></ol> <p>Note that every time the framework executes a UDTF query, a new UDF instance will be constructed. When the query ends, the corresponding instance will be destroyed. Therefore, the internal data of the instances in different UDTF queries (even in the same SQL statement) are isolated. You can maintain some state data in the UDTF without considering the influence of concurrency and other factors.</p> <p>The usage of each interface will be described in detail below.</p> <h3 id="void-validate-udfparametervalidator-validator-throws-exception"><a href="#void-validate-udfparametervalidator-validator-throws-exception" class="header-anchor">#</a> void validate(UDFParameterValidator validator) throws Exception</h3> <p>The <code>validate</code> method is used to validate the parameters entered by the user.</p> <p>In this method, you can limit the number and types of input time series, check the attributes of user input, or perform any custom verification.</p> <p>Please refer to the Javadoc for the usage of <code>UDFParameterValidator</code>.</p> <h3 id="void-beforestart-udfparameters-parameters-udtfconfigurations-configurations-throws-exception"><a href="#void-beforestart-udfparameters-parameters-udtfconfigurations-configurations-throws-exception" class="header-anchor">#</a> void beforeStart(UDFParameters parameters, UDTFConfigurations configurations) throws Exception</h3> <p>This method is mainly used to customize UDTF. In this method, the user can do the following things:</p> <ol><li>Use UDFParameters to get the time series paths and parse key-value pair attributes entered by the user.</li> <li>Set the strategy to access the raw data and set the output data type in UDTFConfigurations.</li> <li>Create resources, such as establishing external connections, opening files, etc.</li></ol> <h4 id="udfparameters"><a href="#udfparameters" class="header-anchor">#</a> UDFParameters</h4> <p><code>UDFParameters</code> is used to parse UDF parameters in SQL statements (the part in parentheses after the UDF function name in SQL). The input parameters have two parts. The first part is the paths (measurements) and their data types of the time series that the UDF needs to process, and the second part is the key-value pair attributes for customization. Only the second part can be empty.</p> <p>Example:</p> <div class="language-sql line-numbers-mode"><pre class="language-sql"><code><span class="token keyword">SELECT</span> UDF<span class="token punctuation">(</span>s1<span class="token punctuation">,</span> s2<span class="token punctuation">,</span> <span class="token string">'key1'</span><span class="token operator">=</span><span class="token string">'iotdb'</span><span class="token punctuation">,</span> <span class="token string">'key2'</span><span class="token operator">=</span><span class="token string">'123.45'</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> root<span class="token punctuation">.</span>sg<span class="token punctuation">.</span>d<span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>Usage:</p> <div class="language-java line-numbers-mode"><pre class="language-java"><code><span class="token keyword">void</span> <span class="token function">beforeStart</span><span class="token punctuation">(</span><span class="token class-name">UDFParameters</span> parameters<span class="token punctuation">,</span> <span class="token class-name">UDTFConfigurations</span> configurations<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span>
<span class="token comment">// parameters</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">PartialPath</span> path <span class="token operator">:</span> parameters<span class="token punctuation">.</span><span class="token function">getPaths</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">TSDataType</span> dataType <span class="token operator">=</span> parameters<span class="token punctuation">.</span><span class="token function">getDataType</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// do something</span>
<span class="token punctuation">}</span>
<span class="token class-name">String</span> stringValue <span class="token operator">=</span> parameters<span class="token punctuation">.</span><span class="token function">getString</span><span class="token punctuation">(</span><span class="token string">&quot;key1&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// iotdb</span>
<span class="token class-name">Float</span> floatValue <span class="token operator">=</span> parameters<span class="token punctuation">.</span><span class="token function">getFloat</span><span class="token punctuation">(</span><span class="token string">&quot;key2&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 123.45</span>
<span class="token class-name">Double</span> doubleValue <span class="token operator">=</span> parameters<span class="token punctuation">.</span><span class="token function">getDouble</span><span class="token punctuation">(</span><span class="token string">&quot;key3&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// null</span>
<span class="token keyword">int</span> intValue <span class="token operator">=</span> parameters<span class="token punctuation">.</span><span class="token function">getIntOrDefault</span><span class="token punctuation">(</span><span class="token string">&quot;key4&quot;</span><span class="token punctuation">,</span> <span class="token number">678</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 678</span>
<span class="token comment">// do something</span>
<span class="token comment">// configurations</span>
<span class="token comment">// ...</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br></div></div><h4 id="udtfconfigurations"><a href="#udtfconfigurations" class="header-anchor">#</a> UDTFConfigurations</h4> <p>You must use <code>UDTFConfigurations</code> to specify the strategy used by UDF to access raw data and the type of output sequence.</p> <p>Usage:</p> <div class="language-java line-numbers-mode"><pre class="language-java"><code><span class="token keyword">void</span> <span class="token function">beforeStart</span><span class="token punctuation">(</span><span class="token class-name">UDFParameters</span> parameters<span class="token punctuation">,</span> <span class="token class-name">UDTFConfigurations</span> configurations<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span>
<span class="token comment">// parameters</span>
<span class="token comment">// ...</span>
<span class="token comment">// configurations</span>
configurations
<span class="token punctuation">.</span><span class="token function">setAccessStrategy</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">RowByRowAccessStrategy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">setOutputDataType</span><span class="token punctuation">(</span><span class="token class-name">TSDataType</span><span class="token punctuation">.</span>INT32<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p>The <code>setAccessStrategy</code> method is used to set the UDF's strategy for accessing the raw data, and the <code>setOutputDataType</code> method is used to set the data type of the output sequence.</p> <h5 id="setaccessstrategy"><a href="#setaccessstrategy" class="header-anchor">#</a> setAccessStrategy</h5> <p>Note that the raw data access strategy you set here determines which <code>transform</code> method the framework will call. Please implement the <code>transform</code> method corresponding to the raw data access strategy. Of course, you can also dynamically decide which strategy to set based on the attribute parameters parsed by <code>UDFParameters</code>. Therefore, two <code>transform</code> methods are also allowed to be implemented in one UDF.</p> <p>The following are the strategies you can set:</p> <table><thead><tr><th style="text-align:left;">Interface definition</th> <th style="text-align:left;">Description</th> <th>The <code>transform</code> Method to Call</th></tr></thead> <tbody><tr><td style="text-align:left;"><code>RowByRowAccessStrategy</code></td> <td style="text-align:left;">Process raw data row by row. The framework calls the <code>transform</code> method once for each row of raw data input. When UDF has only one input sequence, a row of input is one data point in the input sequence. When UDF has multiple input sequences, one row of input is a result record of the raw query (aligned by time) on these input sequences. (In a row, there may be a column with a value of <code>null</code>, but not all of them are <code>null</code>)</td> <td><code>void transform(Row row, PointCollector collector) throws Exception</code></td></tr> <tr><td style="text-align:left;"><code>SlidingTimeWindowAccessStrategy</code></td> <td style="text-align:left;">Process a batch of data in a fixed time interval each time. We call the container of a data batch a window. The framework calls the <code>transform</code> method once for each raw data input window. There may be multiple rows of data in a window, and each row is a result record of the raw query (aligned by time) on these input sequences. (In a row, there may be a column with a value of <code>null</code>, but not all of them are <code>null</code>)</td> <td><code>void transform(RowWindow rowWindow, PointCollector collector) throws Exception</code></td></tr> <tr><td style="text-align:left;"><code>SlidingSizeWindowAccessStrategy</code></td> <td style="text-align:left;">The raw data is processed batch by batch, and each batch contains a fixed number of raw data rows (except the last batch). We call the container of a data batch a window. The framework calls the <code>transform</code> method once for each raw data input window. There may be multiple rows of data in a window, and each row is a result record of the raw query (aligned by time) on these input sequences. (In a row, there may be a column with a value of <code>null</code>, but not all of them are <code>null</code>)</td> <td><code>void transform(RowWindow rowWindow, PointCollector collector) throws Exception</code></td></tr></tbody></table> <p><code>RowByRowAccessStrategy</code>: The construction of <code>RowByRowAccessStrategy</code> does not require any parameters.</p> <p><code>SlidingTimeWindowAccessStrategy</code>: <code>SlidingTimeWindowAccessStrategy</code> has many constructors, you can pass 3 types of parameters to them:</p> <ul><li>Parameter 1: The display window on the time axis</li> <li>Parameter 2: Time interval for dividing the time axis (should be positive)</li> <li>Parameter 3: Time sliding step (not required to be greater than or equal to the time interval, but must be a positive number)</li></ul> <p>The first type of parameters are optional. If the parameters are not provided, the beginning time of the display window will be set to the same as the minimum timestamp of the query result set, and the ending time of the display window will be set to the same as the maximum timestamp of the query result set.</p> <p>The sliding step parameter is also optional. If the parameter is not provided, the sliding step will be set to the same as the time interval for dividing the time axis.</p> <p>The relationship between the three types of parameters can be seen in the figure below. Please see the Javadoc for more details.</p> <div style="text-align:center;"><img src="https://user-images.githubusercontent.com/30497621/99787878-47b51480-2b5b-11eb-8ed3-84088c5c30f7.png" style="width:100%;max-width:800px;max-height:600px;margin-left:auto;margin-right:auto;display:block;"></div> <p>Note that the actual time interval of some of the last time windows may be less than the specified time interval parameter. In addition, there may be cases where the number of data rows in some time windows is 0. In these cases, the framework will also call the <code>transform</code> method for the empty windows.</p> <p><code>SlidingSizeWindowAccessStrategy</code>: <code>SlidingSizeWindowAccessStrategy</code> has many constructors, you can pass 2 types of parameters to them:</p> <ul><li>Parameter 1: Window size. This parameter specifies the number of data rows contained in a data processing window. Note that the number of data rows in some of the last time windows may be less than the specified number of data rows.</li> <li>Parameter 2: Sliding step. This parameter means the number of rows between the first point of the next window and the first point of the current window. (This parameter is not required to be greater than or equal to the window size, but must be a positive number)</li></ul> <p>The sliding step parameter is optional. If the parameter is not provided, the sliding step will be set to the same as the window size.</p> <p>Please see the Javadoc for more details.</p> <h5 id="setoutputdatatype"><a href="#setoutputdatatype" class="header-anchor">#</a> setOutputDataType</h5> <p>Note that the type of output sequence you set here determines the type of data that the <code>PointCollector</code> can actually receive in the <code>transform</code> method. The relationship between the output data type set in <code>setOutputDataType</code> and the actual data output type that <code>PointCollector</code> can receive is as follows:</p> <table><thead><tr><th style="text-align:left;">Output Data Type Set in <code>setOutputDataType</code></th> <th style="text-align:left;">Data Type that <code>PointCollector</code> Can Receive</th></tr></thead> <tbody><tr><td style="text-align:left;"><code>INT32</code></td> <td style="text-align:left;"><code>int</code></td></tr> <tr><td style="text-align:left;"><code>INT64</code></td> <td style="text-align:left;"><code>long</code></td></tr> <tr><td style="text-align:left;"><code>FLOAT</code></td> <td style="text-align:left;"><code>float</code></td></tr> <tr><td style="text-align:left;"><code>DOUBLE</code></td> <td style="text-align:left;"><code>double</code></td></tr> <tr><td style="text-align:left;"><code>BOOLEAN</code></td> <td style="text-align:left;"><code>boolean</code></td></tr> <tr><td style="text-align:left;"><code>TEXT</code></td> <td style="text-align:left;"><code>java.lang.String</code> and <code>org.apache.iotdb.tsfile.utils.Binary</code></td></tr></tbody></table> <p>The type of output time series of a UDTF is determined at runtime, which means that a UDTF can dynamically determine the type of output time series according to the type of input time series.
Here is a simple example:</p> <div class="language-java line-numbers-mode"><pre class="language-java"><code><span class="token keyword">void</span> <span class="token function">beforeStart</span><span class="token punctuation">(</span><span class="token class-name">UDFParameters</span> parameters<span class="token punctuation">,</span> <span class="token class-name">UDTFConfigurations</span> configurations<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span>
<span class="token comment">// do something</span>
<span class="token comment">// ...</span>
configurations
<span class="token punctuation">.</span><span class="token function">setAccessStrategy</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">RowByRowAccessStrategy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">setOutputDataType</span><span class="token punctuation">(</span>parameters<span class="token punctuation">.</span><span class="token function">getDataType</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><h3 id="void-transform-row-row-pointcollector-collector-throws-exception"><a href="#void-transform-row-row-pointcollector-collector-throws-exception" class="header-anchor">#</a> void transform(Row row, PointCollector collector) throws Exception</h3> <p>You need to implement this method when you specify the strategy of UDF to read the original data as <code>RowByRowAccessStrategy</code>.</p> <p>This method processes the raw data one row at a time. The raw data is input from <code>Row</code> and output by <code>PointCollector</code>. You can output any number of data points in one <code>transform</code> method call. It should be noted that the type of output data points must be the same as you set in the <code>beforeStart</code> method, and the timestamps of output data points must be strictly monotonically increasing.</p> <p>The following is a complete UDF example that implements the <code>void transform(Row row, PointCollector collector) throws Exception</code> method. It is an adder that receives two columns of time series as input. When two data points in a row are not <code>null</code>, this UDF will output the algebraic sum of these two data points.</p> <div class="language-java line-numbers-mode"><pre class="language-java"><code><span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span></span>UDTF<span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span>access<span class="token punctuation">.</span></span><span class="token class-name">Row</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span>collector<span class="token punctuation">.</span></span><span class="token class-name">PointCollector</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span>customizer<span class="token punctuation">.</span>config<span class="token punctuation">.</span></span><span class="token class-name">UDTFConfigurations</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span>customizer<span class="token punctuation">.</span>parameter<span class="token punctuation">.</span></span><span class="token class-name">UDFParameters</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span>customizer<span class="token punctuation">.</span>strategy<span class="token punctuation">.</span></span><span class="token class-name">RowByRowAccessStrategy</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>file<span class="token punctuation">.</span>metadata<span class="token punctuation">.</span>enums<span class="token punctuation">.</span></span><span class="token class-name">TSDataType</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Adder</span> <span class="token keyword">implements</span> UDTF <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">beforeStart</span><span class="token punctuation">(</span><span class="token class-name">UDFParameters</span> parameters<span class="token punctuation">,</span> <span class="token class-name">UDTFConfigurations</span> configurations<span class="token punctuation">)</span> <span class="token punctuation">{</span>
configurations
<span class="token punctuation">.</span><span class="token function">setOutputDataType</span><span class="token punctuation">(</span><span class="token class-name">TSDataType</span><span class="token punctuation">.</span>INT64<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">setAccessStrategy</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">RowByRowAccessStrategy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">transform</span><span class="token punctuation">(</span><span class="token class-name">Row</span> row<span class="token punctuation">,</span> <span class="token class-name">PointCollector</span> collector<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>row<span class="token punctuation">.</span><span class="token function">isNull</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">||</span> row<span class="token punctuation">.</span><span class="token function">isNull</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
collector<span class="token punctuation">.</span><span class="token function">putLong</span><span class="token punctuation">(</span>row<span class="token punctuation">.</span><span class="token function">getTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> row<span class="token punctuation">.</span><span class="token function">getLong</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">+</span> row<span class="token punctuation">.</span><span class="token function">getLong</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br></div></div><h3 id="void-transform-rowwindow-rowwindow-pointcollector-collector-throws-exception"><a href="#void-transform-rowwindow-rowwindow-pointcollector-collector-throws-exception" class="header-anchor">#</a> void transform(RowWindow rowWindow, PointCollector collector) throws Exception</h3> <p>You need to implement this method when you specify the strategy of UDF to read the original data as <code>SlidingTimeWindowAccessStrategy</code> or <code>SlidingSizeWindowAccessStrategy</code>.</p> <p>This method processes a batch of data in a fixed number of rows or a fixed time interval each time, and we call the container containing this batch of data a window. The raw data is input from <code>RowWindow</code> and output by <code>PointCollector</code>. <code>RowWindow</code> can help you access a batch of <code>Row</code>, it provides a set of interfaces for random access and iterative access to this batch of <code>Row</code>. You can output any number of data points in one <code>transform</code> method call. It should be noted that the type of output data points must be the same as you set in the <code>beforeStart</code> method, and the timestamps of output data points must be strictly monotonically increasing.</p> <p>Below is a complete UDF example that implements the <code>void transform(RowWindow rowWindow, PointCollector collector) throws Exception</code> method. It is a counter that receives any number of time series as input, and its function is to count and output the number of data rows in each time window within a specified time range.</p> <div class="language-java line-numbers-mode"><pre class="language-java"><code><span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">IOException</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span></span>UDTF<span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span>access<span class="token punctuation">.</span></span><span class="token class-name">RowWindow</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span>collector<span class="token punctuation">.</span></span><span class="token class-name">PointCollector</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span>customizer<span class="token punctuation">.</span>config<span class="token punctuation">.</span></span><span class="token class-name">UDTFConfigurations</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span>customizer<span class="token punctuation">.</span>parameter<span class="token punctuation">.</span></span><span class="token class-name">UDFParameters</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span>customizer<span class="token punctuation">.</span>strategy<span class="token punctuation">.</span></span><span class="token class-name">SlidingTimeWindowAccessStrategy</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>file<span class="token punctuation">.</span>metadata<span class="token punctuation">.</span>enums<span class="token punctuation">.</span></span><span class="token class-name">TSDataType</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Counter</span> <span class="token keyword">implements</span> UDTF <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">beforeStart</span><span class="token punctuation">(</span><span class="token class-name">UDFParameters</span> parameters<span class="token punctuation">,</span> <span class="token class-name">UDTFConfigurations</span> configurations<span class="token punctuation">)</span> <span class="token punctuation">{</span>
configurations
<span class="token punctuation">.</span><span class="token function">setOutputDataType</span><span class="token punctuation">(</span><span class="token class-name">TSDataType</span><span class="token punctuation">.</span>INT32<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">setAccessStrategy</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">SlidingTimeWindowAccessStrategy</span><span class="token punctuation">(</span>
parameters<span class="token punctuation">.</span><span class="token function">getLong</span><span class="token punctuation">(</span><span class="token string">&quot;time_interval&quot;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
parameters<span class="token punctuation">.</span><span class="token function">getLong</span><span class="token punctuation">(</span><span class="token string">&quot;sliding_step&quot;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
parameters<span class="token punctuation">.</span><span class="token function">getLong</span><span class="token punctuation">(</span><span class="token string">&quot;display_window_begin&quot;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
parameters<span class="token punctuation">.</span><span class="token function">getLong</span><span class="token punctuation">(</span><span class="token string">&quot;display_window_end&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">transform</span><span class="token punctuation">(</span><span class="token class-name">RowWindow</span> rowWindow<span class="token punctuation">,</span> <span class="token class-name">PointCollector</span> collector<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>rowWindow<span class="token punctuation">.</span><span class="token function">windowSize</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
collector<span class="token punctuation">.</span><span class="token function">putInt</span><span class="token punctuation">(</span>rowWindow<span class="token punctuation">.</span><span class="token function">getRow</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> rowWindow<span class="token punctuation">.</span><span class="token function">windowSize</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br></div></div><h3 id="void-terminate-pointcollector-collector-throws-exception"><a href="#void-terminate-pointcollector-collector-throws-exception" class="header-anchor">#</a> void terminate(PointCollector collector) throws Exception</h3> <p>In some scenarios, a UDF needs to traverse all the original data to calculate the final output data points. The <code>terminate</code> interface provides support for those scenarios.</p> <p>This method is called after all <code>transform</code> calls are executed and before the <code>beforeDestory</code> method is executed. You can implement the <code>transform</code> method to perform pure data processing (without outputting any data points), and implement the <code>terminate</code> method to output the processing results.</p> <p>The processing results need to be output by the <code>PointCollector</code>. You can output any number of data points in one <code>terminate</code> method call. It should be noted that the type of output data points must be the same as you set in the <code>beforeStart</code> method, and the timestamps of output data points must be strictly monotonically increasing.</p> <p>Below is a complete UDF example that implements the <code>void terminate(PointCollector collector) throws Exception</code> method. It takes one time series whose data type is <code>INT32</code> as input, and outputs the maximum value point of the series.</p> <div class="language-java line-numbers-mode"><pre class="language-java"><code><span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">IOException</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span></span>UDTF<span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span>access<span class="token punctuation">.</span></span><span class="token class-name">Row</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span>collector<span class="token punctuation">.</span></span><span class="token class-name">PointCollector</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span>customizer<span class="token punctuation">.</span>config<span class="token punctuation">.</span></span><span class="token class-name">UDTFConfigurations</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span>customizer<span class="token punctuation">.</span>parameter<span class="token punctuation">.</span></span><span class="token class-name">UDFParameters</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>query<span class="token punctuation">.</span>udf<span class="token punctuation">.</span>api<span class="token punctuation">.</span>customizer<span class="token punctuation">.</span>strategy<span class="token punctuation">.</span></span><span class="token class-name">RowByRowAccessStrategy</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>file<span class="token punctuation">.</span>metadata<span class="token punctuation">.</span>enums<span class="token punctuation">.</span></span><span class="token class-name">TSDataType</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Max</span> <span class="token keyword">implements</span> UDTF <span class="token punctuation">{</span>
<span class="token keyword">private</span> <span class="token class-name">Long</span> time<span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">int</span> value<span class="token punctuation">;</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">beforeStart</span><span class="token punctuation">(</span><span class="token class-name">UDFParameters</span> parameters<span class="token punctuation">,</span> <span class="token class-name">UDTFConfigurations</span> configurations<span class="token punctuation">)</span> <span class="token punctuation">{</span>
configurations
<span class="token punctuation">.</span><span class="token function">setOutputDataType</span><span class="token punctuation">(</span><span class="token class-name">TSDataType</span><span class="token punctuation">.</span>INT32<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">setAccessStrategy</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">RowByRowAccessStrategy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">transform</span><span class="token punctuation">(</span><span class="token class-name">Row</span> row<span class="token punctuation">,</span> <span class="token class-name">PointCollector</span> collector<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">int</span> candidateValue <span class="token operator">=</span> row<span class="token punctuation">.</span><span class="token function">getInt</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>time <span class="token operator">==</span> <span class="token keyword">null</span> <span class="token operator">||</span> value <span class="token operator">&lt;</span> candidateValue<span class="token punctuation">)</span> <span class="token punctuation">{</span>
time <span class="token operator">=</span> row<span class="token punctuation">.</span><span class="token function">getTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
value <span class="token operator">=</span> candidateValue<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">terminate</span><span class="token punctuation">(</span><span class="token class-name">PointCollector</span> collector<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>time <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
collector<span class="token punctuation">.</span><span class="token function">putInt</span><span class="token punctuation">(</span>time<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br></div></div><h3 id="void-beforedestroy"><a href="#void-beforedestroy" class="header-anchor">#</a> void beforeDestroy()</h3> <p>The method for terminating a UDF.</p> <p>This method is called by the framework. For a UDF instance, <code>beforeDestroy</code> will be called after the last record is processed. In the entire life cycle of the instance, <code>beforeDestroy</code> will only be called once.</p> <h2 id="maven-project-example"><a href="#maven-project-example" class="header-anchor">#</a> Maven Project Example</h2> <p>If you use Maven, you can build your own UDF project referring to our <strong>udf-example</strong> module. You can find the project <a href="https://github.com/apache/iotdb/tree/master/example/udf" target="_blank" rel="noopener noreferrer">here<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>.</p> <h2 id="udf-registration"><a href="#udf-registration" class="header-anchor">#</a> UDF Registration</h2> <p>The process of registering a UDF in IoTDB is as follows:</p> <ol><li><p>Implement a complete UDF class, assuming the full class name of this class is <code>org.apache.iotdb.udf.ExampleUDTF</code>.</p></li> <li><p>Package your project into a JAR. If you use Maven to manage your project, you can refer to the Maven project example above.</p></li> <li><p>Place the JAR package in the directory <code>iotdb-server-0.12.0-SNAPSHOT/ext/udf</code> or in a subdirectory of <code>iotdb-server-0.12.0-SNAPSHOT/ext/udf</code>.</p> <blockquote><p>You can specify the root path for the UDF to load the Jar by modifying the 'udf_root_dir' in the configuration file.</p></blockquote></li> <li><p>Register the UDF with the SQL statement, assuming that the name given to the UDF is <code>example</code>.</p></li></ol> <p>The following shows the SQL syntax of how to register a UDF.</p> <div class="language-sql line-numbers-mode"><pre class="language-sql"><code><span class="token keyword">CREATE</span> <span class="token keyword">FUNCTION</span> <span class="token operator">&lt;</span>UDF<span class="token operator">-</span>NAME<span class="token operator">&gt;</span> <span class="token keyword">AS</span> <span class="token operator">&lt;</span>UDF<span class="token operator">-</span>CLASS<span class="token operator">-</span><span class="token keyword">FULL</span><span class="token operator">-</span>PATHNAME<span class="token operator">&gt;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>Here is an example:</p> <div class="language-sql line-numbers-mode"><pre class="language-sql"><code><span class="token keyword">CREATE</span> <span class="token keyword">FUNCTION</span> example <span class="token keyword">AS</span> <span class="token string">&quot;org.apache.iotdb.udf.ExampleUDTF&quot;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>Since UDF instances are dynamically loaded through reflection technology, you do not need to restart the server during the UDF registration process.</p> <p>Note: UDF function names are not case sensitive.</p> <p>Note: Please ensure that the function name given to the UDF is different from all built-in function names. A UDF with the same name as a built-in function cannot be registered.</p> <p>Note: We recommend that you do not use classes that have the same class name but different function logic in different JAR packages. For example, in <code>UDF(UDAF/UDTF): udf1, udf2</code>, the JAR package of udf1 is <code>udf1.jar</code> and the JAR package of udf2 is <code>udf2.jar</code>. Assume that both JAR packages contain the <code>org.apache.iotdb.udf.ExampleUDTF</code> class. If you use two UDFs in the same SQL statement at the same time, the system will randomly load either of them and may cause inconsistency in UDF execution behavior.</p> <h2 id="udf-deregistration"><a href="#udf-deregistration" class="header-anchor">#</a> UDF Deregistration</h2> <p>The following shows the SQL syntax of how to deregister a UDF.</p> <div class="language-sql line-numbers-mode"><pre class="language-sql"><code><span class="token keyword">DROP</span> <span class="token keyword">FUNCTION</span> <span class="token operator">&lt;</span>UDF<span class="token operator">-</span>NAME<span class="token operator">&gt;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>Here is an example:</p> <div class="language-sql line-numbers-mode"><pre class="language-sql"><code><span class="token keyword">DROP</span> <span class="token keyword">FUNCTION</span> example
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h2 id="udf-queries"><a href="#udf-queries" class="header-anchor">#</a> UDF Queries</h2> <p>The usage of UDF is similar to that of built-in aggregation functions.</p> <h3 id="basic-sql-syntax-support"><a href="#basic-sql-syntax-support" class="header-anchor">#</a> Basic SQL syntax support</h3> <ul><li>Support <code>SLIMIT</code> / <code>SOFFSET</code></li> <li>Support <code>LIMIT</code> / <code>OFFSET</code></li> <li>Support <code>NON ALIGN</code></li> <li>Support queries with time filters</li> <li>Support queries with value filters</li></ul> <h3 id="queries-with-in-select-clauses"><a href="#queries-with-in-select-clauses" class="header-anchor">#</a> Queries with * in SELECT Clauses</h3> <p>Assume that there are 2 time series (<code>root.sg.d1.s1</code> and <code>root.sg.d1.s2</code>) in the system.</p> <ul><li><strong><code>SELECT example(*) from root.sg.d1</code></strong></li></ul> <p>Then the result set will include the results of <code>example (root.sg.d1.s1)</code> and <code>example (root.sg.d1.s2)</code>.</p> <ul><li><strong><code>SELECT example(s1, *) from root.sg.d1</code></strong></li></ul> <p>Then the result set will include the results of <code>example(root.sg.d1.s1, root.sg.d1.s1)</code> and <code>example(root.sg.d1.s1, root.sg.d1.s2)</code>.</p> <ul><li><strong><code>SELECT example(*, *) from root.sg.d1</code></strong></li></ul> <p>Then the result set will include the results of <code>example(root.sg.d1.s1, root.sg.d1.s1)</code>, <code>example(root.sg.d1.s2, root.sg.d1.s1)</code>, <code>example(root.sg.d1.s1, root.sg.d1.s2)</code> and <code>example(root.sg.d1.s2, root.sg.d1.s2)</code>.</p> <h3 id="queries-with-key-value-attributes-in-udf-parameters"><a href="#queries-with-key-value-attributes-in-udf-parameters" class="header-anchor">#</a> Queries with Key-value Attributes in UDF Parameters</h3> <p>You can pass any number of key-value pair parameters to the UDF when constructing a UDF query. The key and value in the key-value pair need to be enclosed in single or double quotes. Note that key-value pair parameters can only be passed in after all time series have been passed in. Here is a set of examples:</p> <div class="language-sql line-numbers-mode"><pre class="language-sql"><code><span class="token keyword">SELECT</span> example<span class="token punctuation">(</span>s1<span class="token punctuation">,</span> <span class="token string">&quot;key1&quot;</span><span class="token operator">=</span><span class="token string">&quot;value1&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;key2&quot;</span><span class="token operator">=</span><span class="token string">&quot;value2&quot;</span><span class="token punctuation">)</span><span class="token punctuation">,</span> example<span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">,</span> <span class="token string">&quot;key3&quot;</span><span class="token operator">=</span><span class="token string">&quot;value3&quot;</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> root<span class="token punctuation">.</span>sg<span class="token punctuation">.</span>d1<span class="token punctuation">;</span>
<span class="token keyword">SELECT</span> example<span class="token punctuation">(</span>s1<span class="token punctuation">,</span> s2<span class="token punctuation">,</span> <span class="token string">&quot;key1&quot;</span><span class="token operator">=</span><span class="token string">&quot;value1&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;key2&quot;</span><span class="token operator">=</span><span class="token string">&quot;value2&quot;</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> root<span class="token punctuation">.</span>sg<span class="token punctuation">.</span>d1<span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><h3 id="hybrid-queries"><a href="#hybrid-queries" class="header-anchor">#</a> Hybrid Queries</h3> <p>Currently IoTDB supports hybrid queries of UDF queries and raw data queries, for example:</p> <div class="language-sql line-numbers-mode"><pre class="language-sql"><code><span class="token keyword">SELECT</span> s1<span class="token punctuation">,</span> s2<span class="token punctuation">,</span> example<span class="token punctuation">(</span>s1<span class="token punctuation">,</span> s2<span class="token punctuation">)</span> <span class="token keyword">FROM</span> root<span class="token punctuation">.</span>sg<span class="token punctuation">.</span>d1<span class="token punctuation">;</span>
<span class="token keyword">SELECT</span> <span class="token operator">*</span><span class="token punctuation">,</span> example<span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> root<span class="token punctuation">.</span>sg<span class="token punctuation">.</span>d1 NON ALIGN<span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><h2 id="show-all-registered-udfs"><a href="#show-all-registered-udfs" class="header-anchor">#</a> Show All Registered UDFs</h2> <div class="language-sql line-numbers-mode"><pre class="language-sql"><code><span class="token keyword">SHOW</span> FUNCTIONS
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h2 id="user-permission-management"><a href="#user-permission-management" class="header-anchor">#</a> User Permission Management</h2> <p>There are 3 types of user permissions related to UDF:</p> <ul><li><code>CREATE_FUNCTION</code>: Only users with this permission are allowed to register UDFs</li> <li><code>DROP_FUNCTION</code>: Only users with this permission are allowed to deregister UDFs</li> <li><code>READ_TIMESERIES</code>: Only users with this permission are allowed to use UDFs for queries</li></ul> <p>For more user permissions related content, please refer to <a href="/UserGuide/Master/Operation Manual/Administration.html">Account Management Statements</a>.</p> <h2 id="configurable-properties"><a href="#configurable-properties" class="header-anchor">#</a> Configurable Properties</h2> <p>When querying by a UDF, IoTDB may prompt that there is insufficient memory. You can resolve the issue by configuring <code>udf_initial_byte_array_length_for_memory_control</code>, <code>udf_memory_budget_in_mb</code> and <code>udf_reader_transformer_collector_memory_proportion</code> in <code>iotdb-engine.properties</code> and restarting the server.</p> <h2 id="contribute-udf"><a href="#contribute-udf" class="header-anchor">#</a> Contribute UDF</h2> <p>This part mainly introduces how external users can contribute their own UDFs to the IoTDB community.</p> <h3 id="prerequisites"><a href="#prerequisites" class="header-anchor">#</a> Prerequisites</h3> <ol><li><p>UDFs must be universal.</p> <p>The &quot;universal&quot; mentioned here refers to: UDFs can be widely used in some scenarios. In other words, the UDF function must have reuse value and may be directly used by other users in the community.</p> <p>If you are not sure whether the UDF you want to contribute is universal, you can send an email to <code>dev@iotdb.apache.org</code> or create an issue to initiate a discussion.</p></li> <li><p>The UDF you are going to contribute has been well tested and can run normally in the production environment.</p></li></ol> <h3 id="what-you-need-to-prepare"><a href="#what-you-need-to-prepare" class="header-anchor">#</a> What you need to prepare</h3> <ol><li>UDF source code</li> <li>Test cases</li> <li>Instructions</li></ol> <h4 id="udf-source-code"><a href="#udf-source-code" class="header-anchor">#</a> UDF Source Code</h4> <ol><li>Create the UDF main class and related classes in <code>src/main/java/org/apache/iotdb/db/query/udf/builtin</code> or in its subfolders.</li> <li>Register your UDF in <code>src/main/java/org/apache/iotdb/db/query/udf/builtin/BuiltinFunction.java</code>.</li></ol> <h4 id="test-cases"><a href="#test-cases" class="header-anchor">#</a> Test Cases</h4> <p>At a minimum, you need to write integration tests for the UDF.</p> <p>You can add a test class in <code>server/src/test/java/org/apache/iotdb/db/integration</code>.</p> <h4 id="instructions"><a href="#instructions" class="header-anchor">#</a> Instructions</h4> <p>The instructions need to include: the name and the function of the UDF, the attribute parameters that must be provided when the UDF is executed, the applicable scenarios, and the usage examples, etc.</p> <p>The instructions should be added in <code>docs/UserGuide/Operation Manual/DML Data Manipulation Language.md</code>.</p> <h3 id="submit-a-pr"><a href="#submit-a-pr" class="header-anchor">#</a> Submit a PR</h3> <p>When you have prepared the UDF source code, test cases, and instructions, you are ready to submit a Pull Request (PR) on <a href="https://github.com/apache/iotdb" target="_blank" rel="noopener noreferrer">Github<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>. You can refer to our code contribution guide to submit a PR: <a href="https://iotdb.apache.org/Development/HowToCommit.html" target="_blank" rel="noopener noreferrer">Pull Request Guide<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>.</p> <h2 id="known-implementation-udf-libraries"><a href="#known-implementation-udf-libraries" class="header-anchor">#</a> Known Implementation UDF Libraries</h2> <ul><li><a href="https://thulab.github.io/iotdb-quality" target="_blank" rel="noopener noreferrer">IoTDB-Quality<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>, a UDF library about data quality, including data profiling, data quality evalution and data repairing, etc.</li></ul> <h2 id="q-a"><a href="#q-a" class="header-anchor">#</a> Q&amp;A</h2> <p>Q1: **How to modify the registered UDF? **</p> <p>A1: Assume that the name of the UDF is <code>example</code> and the full class name is <code>org.apache.iotdb.udf.ExampleUDTF</code>, which is introduced by <code>example.jar</code>.</p> <ol><li>Unload the registered function by executing <code>DROP FUNCTION example</code>.</li> <li>Delete <code>example.jar</code> under <code>iotdb-server-0.12.0-SNAPSHOT/ext/udf</code>.</li> <li>Modify the logic in <code>org.apache.iotdb.udf.ExampleUDTF</code> and repackage it. The name of the JAR package can still be <code>example.jar</code>.</li> <li>Upload the new JAR package to <code>iotdb-server-0.12.0-SNAPSHOT/ext/udf</code>.</li> <li>Load the new UDF by executing <code>CREATE FUNCTION example AS &quot;org.apache.iotdb.udf.ExampleUDTF&quot;</code>.</li></ol></div> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/UserGuide/Master/Operation Manual/DML Data Manipulation Language.html" class="prev">
DML (Data Manipulation Language)
</a></span> <span class="next"><a href="/UserGuide/Master/Operation Manual/Kill Query.html">
Kill Query
</a>
</span></p></div> <p style="text-align: center;">Copyright © 2021 The Apache Software Foundation.<br>
Apache and the Apache feather logo are trademarks of The Apache Software Foundation</p> <p style="text-align: center; margin-top: 10px; color: #444">
Contact us: Join QQ Group 659990460 | Add friend <i>tietouqiao</i> and be invited to Wechat Group<br>
see <a href="https://github.com/apache/iotdb/issues/1995">Join the community</a> for more</p></main></div><div class="global-ui"></div></div>
<script src="/assets/js/app.fe44b663.js" defer></script><script src="/assets/js/3.5626571b.js" defer></script><script src="/assets/js/89.fb10ca17.js" defer></script>
</body>
</html>