多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Apache Zeppelin Cassandra CQL 解释器完全指南:从连接配置到 Prepared Statement 与动态表单实战

Apache Zeppelin Cassandra CQL 解释器完全指南:从连接配置到 Prepared Statement 与动态表单实战 后端前端大数据数据分析【免费下载链接】zeppelinWeb-based notebook that enables>项目地址https://gitcode.com/gh_mirrors/zeppelin2/zeppelin点击查看免费下载本文以 Apache Zeppelin 仓库中的 Cassandra CQL Interpreter 官方文档 为骨架结合cassandra模块源码CassandraInterpreter.java、InterpreterLogic.scala、ParagraphParser.scala 等系统讲解如何在 Zeppelin 笔记本中使用%cassandra解释器直接执行 CQL 语句、描述集群 Schema、注入运行时查询参数、复用 Prepared Statement并通过动态表单交互式查询 Cassandra。读完本文你将掌握 Cassandra 解释器的完整命令体系、全部配置参数的含义与默认值以及底层执行原理可直接上手在笔记本中开展交互式数据分析。解释器概览%cassandraCassandra CQL 解释器是 Apache Zeppelin 官方提供的一个解释器模块用于在笔记本段落中直接执行 Apache Cassandra 的 CQL 查询语言。其核心信息如下NameClassDescription%cassandraCassandraInterpreter为 Apache Cassandra CQL 查询语言提供解释执行能力该解释器基于 DataStax 官方Cassandra Java Driver构建模块描述为 Zeppelin: Apache Cassandra interpreter依赖cassandra-driver-core3.0.1见 cassandra/pom.xml。从源码结构看解释器采用 Java 入口 Scala 逻辑 的双语言实现Java 类CassandraInterpreter负责生命周期管理open/close/interpret/getSchedulerScala 类InterpreterLogic负责真正的话语解析与执行ParagraphParser基于 Scala 组合子解析器scala.util.parsing.combinator将段落文本切分为命令块。启用 Cassandra 解释器在笔记本中启用Cassandra解释器点击笔记本右上角的Gear齿轮图标在弹出的解释器绑定对话框中勾选Cassandra即可。Cassandra 解释器在构建产物中以zeppelin-cassandra_2.10的形式存在见 cassandra/pom.xml 中的interpreter.namecassandra因此该模块会被 Zeppelin 在启动时自动识别并注册到解释器列表中。使用 Cassandra 解释器在段落的输入区使用%cassandra选择 Cassandra 解释器然后输入命令。例如%cassandra SELECT * FROM users LIMIT 10;要获取交互式帮助菜单直接在段落中输入HELP;从源码看HELP;命令由ParagraphParser中的HELP_PATTERN(?i)\s*HELP;\s*$大小写不敏感识别并由EnhancedSession.execute(helpCmd)以%html格式输出帮助内容见 EnhancedSession.scala。解释器命令体系Cassandra 解释器接受以下五类命令命令类型命令名称描述Help 命令HELP显示交互式帮助菜单Schema 命令DESCRIBE KEYSPACE、DESCRIBE CLUSTER、DESCRIBE TABLES...用于描述 Cassandra Schema 的自定义命令Option 命令consistency、retryPolicy、fetchSize...为段落中所有语句注入运行时选项Prepared statement 命令prepare、bind、remove_prepare注册预编译语句并稍后通过注入绑定值复用原生 CQL 语句所有 CQL 兼容语句SELECT、INSERT、CREATE...所有 CQL 语句直接对 Cassandra 服务器执行在 ParagraphParser.scala 中这五类命令都有对应的正则模式运行时参数使用consistency\s*\s*(...)一类模式prepare、bind、remove_prepare使用方括号命名模式Schema 命令则支持DESCRIBE/DESC两种缩写且全部大小写不敏感。CQL 语句该解释器兼容 Cassandra 支持的任何 CQL 语句例如INSERT INTO users(login,name) VALUES(jdoe,John DOE); SELECT * FROM users WHERE loginjdoe;每条语句必须以分号;分隔但下列特殊命令除外不要加分号preparebindremove_prepareconsistencyserialConsistencytimestampretryPolicyfetchSizerequestTimeOut多行语句以及同一行内的多条语句均被支持只要以分号分隔即可。例如USE spark_demo; SELECT * FROM albums_by_country LIMIT 1; SELECT * FROM countries LIMIT 1; SELECT * FROM artists WHERE loginjlennon;批量Batch语句支持跨多行DDL 语句CREATE/ALTER/DROP同样支持BEGIN BATCH INSERT INTO users(login,name) VALUES(jdoe,John DOE); INSERT INTO users_preferences(login,account_type) VALUES(jdoe,BASIC); APPLY BATCH; CREATE TABLE IF NOT EXISTS test( key int PRIMARY KEY, value text );CQL 语句是大小写不敏感的列名和值除外因此以下语句等价且合法INSERT INTO users(login,name) VALUES(jdoe,John DOE); Insert into users(login,name) vAlues(hsue,Helen SUE);解释器对 CQL 的兼容性覆盖 Cassandra 1.2 / 2.0 / 2.1 / 2.2 / 3.x 多个版本完整 CQL 语句清单可查阅 DataStax 各版本对应的 CQL 参考文档。从源码看通用语句的前缀模式GENERIC_STATEMENT_PREFIX覆盖了INSERT、UPDATE、DELETE、SELECT、CREATE、ALTER、DROP、GRANT、REVOKE、TRUNCATE、LIST、USE等关键字且以(?is)开启大小写不敏感与 DOTALL 模式批量语句则通过BATCH_PATTERN支持BEGIN BATCH、BEGIN UNLOGGED BATCH与BEGIN COUNTER BATCH三种类型。语句中的注释可以在语句之间添加注释。单行注释以**井号#或双斜杠//**开头多行注释包裹在/**与*/之间。例如#Single line comment style 1 INSERT INTO users(login,name) VALUES(jdoe,John DOE); //Single line comment style 2 /** Multi line comments **/ Insert into users(login,name) vAlues(hsue,Helen SUE);语法验证解释器内置了一个语法验证器但它只检查基本的语法错误所有与 CQL 相关的语法校验都直接委托给Cassandra服务器本身。大多数时候语法错误源于语句之间缺少分号或拼写错误。从 InterpreterLogic.scala 的parseInput实现可见当ParagraphParser解析失败时会抛出包含提示语 Did you forget to add ; (semi-colon) at the end of each CQL statement ? 的InterpreterException并在段落中以 ERROR 状态呈现。Schema 命令交互式 Schema 发现为了让 Schema 发现更简单、更交互化解释器提供了以下命令命令描述DESCRIBE CLUSTER;显示当前集群名称及其分区器partitionerDESCRIBE KEYSPACES;列出集群中所有已存在的 keyspace 及其配置复制因子、durable write 等DESCRIBE TABLES;列出集群中所有已存在的 keyspace以及每个 keyspace 下的所有表名DESCRIBE TYPES;列出集群中所有已存在的 keyspace以及每个 keyspace 下的所有用户自定义类型UDT名DESCRIBE FUNCTIONS;列出集群中所有已存在的 keyspace以及每个 keyspace 下的所有函数名DESCRIBE AGGREGATES;列出集群中所有已存在的 keyspace以及每个 keyspace 下的所有聚合函数名DESCRIBE MATERIALIZED VIEWS;列出集群中所有已存在的 keyspace以及每个 keyspace 下的所有物化视图名DESCRIBE KEYSPACE keyspace_name;描述给定 keyspace 的配置及其全部表的细节名称、列等DESCRIBE TABLE (keyspace_name).table_name;描述给定表。若未提供 keyspace则使用当前登录的 keyspace若未登录任何 keyspace则使用默认的 system keyspace若未找到表则抛出错误消息DESCRIBE TYPE (keyspace_name).type_name;描述给定的类型UDT。keyspace 缺省规则同上若未找到类型则抛出错误消息DESCRIBE FUNCTION (keyspace_name).function_name;描述给定函数。keyspace 缺省规则同上若未找到函数则抛出错误消息DESCRIBE AGGREGATE (keyspace_name).aggregate_name;描述给定聚合函数。keyspace 缺省规则同上若未找到聚合函数则抛出错误消息DESCRIBE MATERIALIZED VIEW (keyspace_name).view_name;描述给定物化视图。keyspace 缺省规则同上若未找到视图则抛出错误消息Schema 对象cluster、keyspace、table、type、function 和 aggregate以表格形式展示。左上角有下拉菜单用于展开对象详情右上角菜单展示图标图例。在实现层面上述命令由 EnhancedSession.scala 中的execute(describeXxx)系列方法完成它们读取session.getCluster.getMetadata将元数据如KeyspaceMetadata、TableMetadata、MaterializedViewMetadata等交给 DisplaySystem.scala 渲染为%html交互界面。元数据展示模型列类型分区键/聚类列/静态列/普通列、索引、复制配置等定义在 MetaDataHierarchy.scala 中。对于 keyspace 缺省则回退到当前登录 keyspace、否则使用 system 的规则源码中的实现是describeTable.keyspace.orElse(Option(session.getLoggedKeyspace)).getOrElse(system)。运行时参数向语句注入查询选项有时你需要向语句传递运行时的查询参数。这些参数不属于 CQL 规范是解释器特有的扩展。完整参数列表如下参数语法描述Consistency Levelconsistencyvalue将给定的一致性级别应用到段落中所有查询Serial Consistency LevelserialConsistencyvalue将给定的串行一致性级别应用到段落中所有查询Timestamptimestamplong value将给定的时间戳应用到段落中所有查询。注意直接在 CQL 语句中传递的 timestamp 值会覆盖此参数Retry PolicyretryPolicyvalue将给定的重试策略应用到段落中所有查询Fetch SizefetchSizeinteger value将给定的 fetch size 应用到段落中所有查询Request Time OutrequestTimeOutinteger value将给定的请求超时时间毫秒应用到段落中所有查询部分参数只接受受限取值参数可选值Consistency LevelALL, ANY, ONE, TWO, THREE, QUORUM, LOCAL_ONE, LOCAL_QUORUM, EACH_QUORUMSerial Consistency LevelSERIAL, LOCAL_SERIALTimestamp任意 long 值Retry PolicyDEFAULT, DOWNGRADING_CONSISTENCY, FALLTHROUGH, LOGGING_DEFAULT, LOGGING_DOWNGRADING, LOGGING_FALLTHROUGHFetch Size任意整数请注意不要在每个参数语句末尾添加分号;。使用示例——通过timestamp控制写入时间戳CREATE TABLE IF NOT EXISTS spark_demo.ts( key int PRIMARY KEY, value text ); TRUNCATE spark_demo.ts; // Timestamp in the past timestamp10 // Force timestamp directly in the first insert INSERT INTO spark_demo.ts(key,value) VALUES(1,first insert) USING TIMESTAMP 100; // Select some data to make the clock turn SELECT * FROM spark_demo.albums LIMIT 100; // Now insert using the timestamp parameter set at the beginning(10) INSERT INTO spark_demo.ts(key,value) VALUES(1,second insert); // Check for the result. You should see first insert SELECT value FROM spark_demo.ts WHERE key1;关于查询参数有以下几点重要说明同一个段落中可以设置多个查询参数如果同一个查询参数被多次设置且值不同解释器只取第一个值每个查询参数作用于同一段落中的所有 CQL 语句除非你用纯 CQL 文本覆盖该选项例如用USING子句强制指定 timestamp查询参数与 CQL 语句之间的先后顺序无关紧要。上述行为在源码中有精确对应ParagraphParser为每个参数定义了严格的校验正则如TIMESTAMP_PATTERN ^\s*timestamp\s*\s*([0-9])\s*$而 InterpreterLogic.scala 的extractQueryOptions使用.headOption只取同一类参数的第一个值applyQueryOptions则把解析后的选项逐一应用到每条StatementsetConsistencyLevel、setSerialConsistencyLevel、setDefaultTimestamp、setRetryPolicy、setFetchSize、setReadTimeoutMillis。其中重试策略在源码中映射为 DataStax 驱动策略DEFAULT→Policies.defaultRetryPolicy()、DOWNGRADING_CONSISTENCY→DowngradingConsistencyRetryPolicy.INSTANCE、FALLTHROUGH→FallthroughRetryPolicy.INSTANCE以及对应的三种 Logging 包装策略。支持 Prepared Statement出于性能考虑最好预先准备prepare语句之后通过提供绑定值来复用。解释器提供 3 条命令处理 prepared 与 bound 语句preparebindremove_prepare基本语法prepare[statement-name]... bind[statement-name]text, 1223, 2015-07-30 12:00:01, null, true, [list_item1, list_item2] bind[statement-name-with-no-bound-value] remove_prepare[statement-name]prepare使用语法prepare[statement-name]SELECT...创建预编译语句。statement-name 是必需的解释器使用 Java 驱动准备给定的语句并将生成的PreparedStatement保存到内部哈希表中以提供的statement-name作为查找键。注意由于 Cassandra 解释器只有一个实例这个内部预编译语句表被所有笔记本和所有段落共享。如果解释器遇到多个使用相同statement-name键的prepare只有第一条语句会被采纳。示例prepare[select]SELECT * FROM spark_demo.albums LIMIT ? prepare[select]SELECT * FROM spark_demo.artists LIMIT ?对于上述示例预编译语句是SELECT * FROM spark_demo.albums LIMIT ?而SELECT * FROM spark_demo.artists LIMIT ?被忽略因为预编译语句表中已存在键为select的条目。在Zeppelin的语境下笔记本可能被调度为定期执行因此避免反复预编译同一条语句这被视为反模式是必要的。从源码看InterpreterLogic使用new ConcurrentHashMap[String,PreparedStatement]存放预编译语句并通过preparedStatements.getOrElseUpdate(statement.name, session.prepare(statement.query))实现 已存在则不重复 prepare 的语义见 InterpreterLogic.scala。bind一旦语句被预编译可能在另一个笔记本/段落中你就可以为它绑定值bind[select_first]10bind语句并不强制要求提供绑定值。但如果提供它们必须符合以下语法规则字符串值应包裹在单引号之间日期值应包裹在单引号之间并遵守如下格式完整列表见 DataStax 的 timestamp 类型参考文档yyyy-MM-dd HH:MM:ssyyyy-MM-dd HH:MM:ss.SSSnull原样解析布尔值true/false原样解析集合值必须遵循标准 CQL 语法list[list_item1, list_item2, ...]set{set_item1, set_item2, ...}map{key1: val1, key2: val2, ...}tuple值应包裹在圆括号之间见 CQL 的 Tuple 语法(text, 123, true)udt值应包裹在花括号之间见 CQL 的 UDT 语法{stree_name: Beverly Hills, number: 104, zip_code: 90020, state: California, ...}也可以在 batch 内部使用bindBEGIN BATCH bind[insert_user]jdoe,John DOE UPDATE users SET age 27 WHERE loginhsue; APPLY BATCH;从源码看绑定值的类型转换发生在InterpreterLogic.createBoundStatement解释器根据 prepared statement 的变量元数据ps.getVariables逐个匹配类型通过驱动CodecRegistry解析文本值——TEXT/VARCHAR/ASCII去除引号、INT/VARINT转Int、BIGINT/COUNTER转Long、BLOB转ByteBuffer、BOOLEAN转Boolean、DECIMAL/DOUBLE/FLOAT转对应数字类型、INET转InetAddress、TIMESTAMP按上述两种格式解析、UUID/TIMEUUID转java.util.UUID、LIST/SET/MAP/UDT/TUPLE则交给 BoundValuesParser.scala 解析后再由 codec 转换。若绑定值的数量与 prepared statement 的变量数量不一致会抛出明确错误。remove_prepare为避免预编译语句永远驻留在预编译语句表中可以使用remove_prepare[statement-name]语法将其移除。移除一个不存在的预编译语句不会产生错误。使用动态表单与其硬编码 CQL 查询不如使用Zeppelin 动态表单语法来注入简单值或多项选择表单。旧式 mustache 语法{{ }}用于绑定输入文本和下拉选择表单仍然受支持但已弃用将在未来版本中移除。Legacy旧式语法简单参数的语法是{{input_Labeldefault value}}。默认值是必需的因为段落第一次执行时我们在渲染表单之前就发起 CQL 查询所以至少需要一个值。多项选择参数的语法是{{input_Labelvalue1 | value2 | ... | valueN}}。默认情况下段落第一次执行时使用第一个选项执行 CQL 查询。示例#Secondary index on performer style SELECT name, country, performer FROM spark_demo.performers WHERE name${performerSheryl Crow|Doof|Fanfarlo|Los Paranoia} AND styles CONTAINS ${styleRock};在上述示例中第一次 CQL 查询将以performerSheryl Crow AND styleRock执行。后续查询时你可以直接用表单修改值。请注意我们把${ }块包裹在单引号之间因为 Cassandra 在这里期望一个字符串。也可以使用${styleRock}语法但此时表单上显示的值是Rock而不是Rock。动态表单同样可用于预编译语句bind[select]${performerSheryl Crow|Doof|Fanfarlo|Los Paranoia}, ${styleRock}在底层InterpreterLogic.scala 的maybeExtractVariables实现动态表单替换先到 Zeppelin 的AngularObjectRegistry中按变量名noteIdparagraphId作用域查找已有值若找到则直接替换否则通过context.getGui.select(...)或context.getGui.input(...)动态创建表单控件。这也解释了为何文档强调 FormType.SIMPLE 下的表单是程序化动态生成的。CassandraInterpreter.getFormType()返回FormType.SIMPLE正是动态表单的入口。共享状态与并行执行可以并行执行多个段落。但在后端解释器仍然使用同步查询只有能在InterpreterResult中返回Future值时才可能实现异步执行——这是 Zeppelin 项目的一个潜在改进点。最近Zeppelin允许你为解释器选择隔离级别参见 解释器绑定模式。简单来说你有 3 种可用绑定shared共享所有笔记本使用同一个 JVM和同一个解释器实例scoped作用域同一个 JVM但为每个笔记本创建不同的解释器实例isolated隔离每个笔记本运行独立的 JVM和单个解释器实例。使用shared绑定时所有笔记本和段落共享同一个com.datastax.driver.core.Session对象。因此如果你使用USE keyspace_name;语句登录某个 keyspace它将改变所有当前使用该解释器的用户的 keyspace因为每个 Cassandra 解释器实例只创建一个Session对象。同样的提醒也适用于预编译语句哈希表它被所有使用同一个 Cassandra 解释器实例的用户共享。使用scoped绑定时在同一个 JVM中Zeppelin会创建多个 Cassandra 解释器实例从而创建多个Session对象。注意使用此绑定时的资源和内存开销isolated模式最极端每个不同的笔记本都会创建一个 JVM 与Session对象。从源码看CassandraInterpreter.getScheduler()使用SchedulerFactory创建一个并行调度器并发度由配置项cassandra.interpreter.parallelism默认 10控制——这就是 多个段落可并行执行 的实现基础。解释器配置要配置Cassandra解释器进入Interpreter菜单并向下滚动修改参数。Cassandra 解释器使用官方Cassandra Java Driver大多数参数都用于配置该 Java 驱动。配置参数及其默认值如下Property NameDescriptionDefault Valuecassandra.cluster要连接的 Cassandra 集群名称Test Clustercassandra.compression.protocol线上传输压缩协议。可选值NONE、SNAPPY、LZ4NONEcassandra.credentials.username若启用了安全认证提供用户名nonecassandra.credentials.password若启用了安全认证提供密码nonecassandra.hosts逗号分隔的 Cassandra 主机DNS 名称或 IP 地址。例如192.168.0.12,node2,node3localhostcassandra.interpreter.parallelism可并发执行的段落查询块数量10cassandra.keyspace要连接的默认 keyspace。强烈建议保留默认值并在所有查询中给表名加上实际 keyspace 前缀systemcassandra.load.balancing.policy负载均衡策略。默认 new TokenAwarePolicy(new DCAwareRoundRobinPolicy())。要指定自定义策略提供策略的_全限定类名FQCN_运行时会通过Class.forName(FQCN)实例化DEFAULTcassandra.max.schema.agreement.wait.secondCassandra 最大 schema 一致性等待时间秒10cassandra.pooling.core.connection.per.host.local协议 V2 及以下默认 2协议 V3 及以上默认 12cassandra.pooling.core.connection.per.host.remote协议 V2 及以下默认 1协议 V3 及以上默认 11cassandra.pooling.heartbeat.interval.secondsCassandra 连接池心跳间隔秒30cassandra.pooling.idle.timeout.secondsCassandra 空闲超时时间秒120cassandra.pooling.max.connection.per.host.local协议 V2 及以下默认 8协议 V3 及以上默认 18cassandra.pooling.max.connection.per.host.remote协议 V2 及以下默认 2协议 V3 及以上默认 12cassandra.pooling.max.request.per.connection.local协议 V2 及以下默认 128协议 V3 及以上默认 1024128cassandra.pooling.max.request.per.connection.remote协议 V2 及以下默认 128协议 V3 及以上默认 256128cassandra.pooling.new.connection.threshold.local协议 V2 及以下默认 100协议 V3 及以上默认 800100cassandra.pooling.new.connection.threshold.remote协议 V2 及以下默认 100协议 V3 及以上默认 200100cassandra.pooling.pool.timeout.millisecsCassandra 连接池获取连接超时时间毫秒5000cassandra.protocol.versionCassandra 二进制协议版本4cassandra.query.default.consistencyCassandra 查询默认一致性级别。可选值ONE、TWO、THREE、QUORUM、LOCAL_ONE、LOCAL_QUORUM、EACH_QUORUM、ALLONEcassandra.query.default.fetchSizeCassandra 查询默认 fetch size5000cassandra.query.default.serial.consistencyCassandra 查询默认串行一致性级别。可选值SERIAL、LOCAL_SERIALSERIALcassandra.reconnection.policyCassandra 重连策略。默认 new ExponentialReconnectionPolicy(1000, 10 * 60 * 1000)。要指定自定义策略提供 FQCN运行时会通过Class.forName(FQCN)实例化DEFAULTcassandra.retry.policyCassandra 重试策略。默认 DefaultRetryPolicy.INSTANCE。要指定自定义策略提供 FQCN运行时会通过Class.forName(FQCN)实例化DEFAULTcassandra.socket.connection.timeout.millisecsCassandra socket 默认连接超时时间毫秒500cassandra.socket.read.timeout.millisecsCassandra socket 读取超时时间毫秒12000cassandra.socket.tcp.no_delayCassandra socket TCP no delaytruecassandra.speculative.execution.policyCassandra 推测执行策略。默认 NoSpeculativeExecutionPolicy.INSTANCE。要指定自定义策略提供 FQCN运行时会通过Class.forName(FQCN)实例化DEFAULTcassandra.ssl.enabled是否启用对配置了 SSL 的 Cassandra 的连接支持。要连接配置了 SSL 的 Cassandra请使用true并提供如下 truststore 文件与密码选项falsecassandra.ssl.truststore.path用于连接 SSL 版 Cassandra 的 truststore 文件路径空cassandra.ssl.truststore.password用于连接 SSL 版 Cassandra 的 truststore 文件密码空在上述文档列出的参数之外从 CassandraInterpreter.java 的常量定义还可以看到几个额外的可配置项说明文档表格并非配置全集cassandra.native.portCassandra 原生协议端口默认9042DEFAULT_PORT 9042。源码在open()中通过parseInt(getProperty(CASSANDRA_PORT))读取并传给Cluster.builder().withPort(port)cassandra.query.default.idempotence查询默认幂等性由JavaDriverConfig.getQueryOptions读取并设置cassandra.socket.keep.alive、cassandra.socket.received.buffer.size.bytes、cassandra.socket.send.buffer.size.bytes、cassandra.socket.reuse.address、cassandra.socket.soLinger额外的 socket 选项仅在配置值非空时生效见 JavaDriverConfig.scala 中的isNotBlank判断。SSL 连接的实现细节也值得注意当cassandra.ssl.enabledtrue时CassandraInterpreter.open()会以 JKS 格式加载cassandra.ssl.truststore.path指定的 truststore初始化TrustManagerFactory构建 TLS 的SSLContext并通过JdkSSLOptions.builder().withSSLContext(...)挂接到Cluster.Builder。此外连接池默认值会随协议版本自动调整JavaDriverConfig.getProtocolVersion根据cassandra.protocol.version1/2/3/4分别设置对应版本的连接池默认值例如 V3/V4 协议下 local 主机最大连接数为 1、单连接最大请求数为 1024这与文档表格中 协议 V2 及以下 / V3 及以上 的说明完全吻合。变更日志3.0Zeppelin 0.8.x更新文档与交互式文档支持二进制协议V4实现新的requestTimeOut运行时选项升级 Java 驱动版本至3.0.1允许解释器在使用 FormType.SIMPLE 时程序化添加动态表单允许动态表单使用默认的 Zeppelin 语法修复 FallThroughPolicy 拼写错误在创建动态表单前先查找 AngularObjectRegistry 中的数据补充对ALTER语句的支持2.0Zeppelin 0.7.x更新帮助菜单并添加 changelog支持用户自定义函数UDF、用户自定义聚合UDA与物化视图Materialized Views升级 Java 驱动版本至3.0.0-rc11.0Zeppelin 0.5.5-incubating初始版本源码阅读指引如果你希望深入理解本文涉及的所有机制可以直接阅读cassandra模块下的以下关键文件CassandraInterpreter.java解释器生命周期、Cluster/Session 构建、SSL 支持、并行调度器InterpreterLogic.scala段落解析入口、查询选项提取、prepared statement 管理与绑定值类型转换、动态表单替换ParagraphParser.scala基于正则与组合子解析的完整命令语法定义EnhancedSession.scalaDESCRIBE 系列 Schema 命令的执行与 HTML 渲染JavaDriverConfig.scalaSocket/Query/Pooling 选项与策略的装配BoundValuesParser.scalabind绑定值list/set/map/tuple/udt的语法解析ParagraphParserTest.scala覆盖混合语句、注释、一致性级别解析等核心场景的测试用例是理解命令语法行为的最佳佐证。如果你在使用该解释器时遇到 bug可以到 Apache Zeppelin 的 JIRA 系统提交 ticket并附上复现场景以便社区跟进修复。赞分享后端前端大数据数据分析【免费下载链接】zeppelinWeb-based notebook that enables>项目地址https://gitcode.com/gh_mirrors/zeppelin2/zeppelin点击查看免费下载相关推荐Apache Zeppelin Cassandra CQL 解释器完全指南连接配置、Schema 描述、Prepared Statement 与动态表单实战Apache Zeppelin Cassandra CQL 解释器完全指南连接配置、Schema 描述、Prepared Statement 与动态表单实战数据分析数据可视化大数据后端Apache Zeppelin Cassandra CQL 解释器完全指南从连接配置到预编译语句与格式化输出Apache Zeppelin Cassandra CQL 解释器完全指南从连接配置到预编译语句与格式化输出 Apache Zeppelin 内置的 %cas数据分析数据可视化大数据后端前端任务调度OpenProject 平板分屏导航实战iPad 与 Android 大屏上的高效工作包审阅工作流OpenProject 平板分屏导航实战iPad 与 Android 大屏上的高效工作包审阅工作流 OpenProject 移动应用Beta在 iPad后端前端大数据数据分析上一篇daisyUI for Cursor安装与使用 UI Design Plugin 的完整指南下一篇从API错误到稳定调用GPT4Free中Blackbox端点变更的技术解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表