ERROR 604 (42P00): Syntax error. Mismatched input. Expecting "RPAREN", got "ffffd72e"

在使用Sqoop将数据从HBase导出到Hive的过程中,遇到了Phoenix的错误ERROR 604 (42P00):Syntax error. Mismatched input 'ffffd72e'. 解决这个问题的关键在于添加--boundary-query参数,具体解决方案参考链接:https://github.com/forcedotcom/phoenix/wiki/Tuning。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sqoop 导hbase数据到hive

sqoop import  --driver org.apache.phoenix.jdbc.PhoenixDriver  --connect jdbc:phoenix:192.168.35.27,192.168.35.32,192.168.35.33:2181    --query "select *  from \"ods_app_deviceInfo\" where \$CONDITIONS and \"DAYSTR\" ='20190921'"  --hive-table s_evt_sjl_ods_app_eventInfo_i_d  --hive-database stage  --target-dir /user/hive/warehouse/stage.db/s_evt_sjl_ods_app_eventInfo_i_d/20190921  --hive-import  --delete-target-dir  --hive-overwrite  --split-by rowkey  --hive-partition-key dt  --hive-partition-value 20190921

phoenix 报错信息

19/10/09 16:06:57 INFO db.DBInputFormat: Using read commited transaction isolation
19/10/09 16:06:57 INFO mapred.MapTask: Processing split: rowkey >= 'KKKMS耼耲S' AND rowkey < 'X聘聘聙聛쀹쀲\'
19/10/09 16:06:57 INFO db.DBRecordReader: Working on split: rowkey >= 'KKKMS耼耲S' AND rowkey < 'X聘聘聙聛쀹쀲\'
19/10/09 16:06:57 ERROR db.DBRecordReader: Top level exception: 
org.apache.phoenix.exception.PhoenixParserException: ERROR 601 (42P00): Syntax error. Unexpected char: '''
        at org.apache.phoenix.exception.PhoenixParserException.newException(PhoenixParserException.java:33)
        at org.apache.phoenix.parse.SQLParser.parseStatement(SQLParser.java:118)
        at org.apache.phoenix.jdbc.PhoenixStatement$PhoenixStatementParser.parseStatement(PhoenixStatement.java:1185)
        at org.apache.phoenix.jdbc.PhoenixStatement.parseStatement(PhoenixStatement.java:1268)
        at org.apache.phoenix.jdbc.PhoenixPreparedStatement.<init>(PhoenixPreparedStatement.java:94)
        at org.apache.phoenix.jdbc.PhoenixConnection.prepareStatement(PhoenixConnection.java:715)
        at org.apache.phoenix.jdbc.PhoenixConnection.prepareStatement(PhoenixConnection.java:744)
        at org.apache.sqoop.mapreduce.db.DBRecordReader.executeQuery(DBRecordReader.java:101)
        at org.apache.sqoop.mapreduce.db.DBRecordReader.nextKeyValue(DBRecordReader.java:235)
        at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:562)
        at org.apache.hadoop.mapreduce.task.MapContextImpl.nextKeyValue(MapContextImpl.java:80)
        at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.nextKeyValue(WrappedMapper.java:91)
        at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
        at org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:64)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:793)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
        at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:270)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: Unexpected char: '''
        at org.apache.phoenix.parse.PhoenixSQLLexer.mOTHER(PhoenixSQLLexer.java:4170)
        at org.apache.phoenix.parse.PhoenixSQLLexer.mTokens(PhoenixSQLLexer.java:5234)
        at org.antlr.runtime.Lexer.nextToken(Lexer.java:85)
        at org.antlr.runtime.BufferedTokenStream.fetch(BufferedTokenStream.java:143)
        at org.antlr.runtime.BufferedTokenStream.sync(BufferedTokenStream.java:137)
        at org.antlr.runtime.CommonTokenStream.skipOffTokenChannels(CommonTokenStream.java:113)
        at org.antlr.r
Build target 'Target 1' assembling miaobiao.asm... miaobiao.asm(68): error A39: REGISTER OPERAND EXPECTED miaobiao.asm(73): error A39: REGISTER OPERAND EXPECTED miaobiao.asm(78): error A39: REGISTER OPERAND EXPECTED miaobiao.asm(87): error A17: INVALID BYTE BASE IN BIT ADDRESS EXPRESSION miaobiao.asm(95): warning A52: VALUE HAS BEEN TRUNCATED TO 8 BITS miaobiao.asm(108): error A9: SYNTAX ERROR miaobiao.asm(108): error A9: SYNTAX ERROR miaobiao.asm(110): error A9: SYNTAX ERROR miaobiao.asm(110): error A7: LABEL NOT PERMITTED miaobiao.asm(117): error A17: INVALID BYTE BASE IN BIT ADDRESS EXPRESSION miaobiao.asm(122): error A9: SYNTAX ERROR miaobiao.asm(122): error A9: SYNTAX ERROR miaobiao.asm(123): error A17: INVALID BYTE BASE IN BIT ADDRESS EXPRESSION miaobiao.asm(124): error A9: SYNTAX ERROR miaobiao.asm(124): error A7: LABEL NOT PERMITTED miaobiao.asm(136): error A9: SYNTAX ERROR miaobiao.asm(136): error A9: SYNTAX ERROR miaobiao.asm(140): error A9: SYNTAX ERROR miaobiao.asm(140): error A9: SYNTAX ERROR miaobiao.asm(142): error A9: SYNTAX ERROR miaobiao.asm(142): error A7: LABEL NOT PERMITTED miaobiao.asm(144): error A9: SYNTAX ERROR miaobiao.asm(144): error A9: SYNTAX ERROR miaobiao.asm(148): error A9: SYNTAX ERROR miaobiao.asm(148): error A9: SYNTAX ERROR miaobiao.asm(150): error A9: SYNTAX ERROR miaobiao.asm(150): error A7: LABEL NOT PERMITTED miaobiao.asm(152): error A9: SYNTAX ERROR miaobiao.asm(152): error A9: SYNTAX ERROR miaobiao.asm(156): error A9: SYNTAX ERROR miaobiao.asm(156): error A9: SYNTAX ERROR miaobiao.asm(158): error A9: SYNTAX ERROR miaobiao.asm(158): error A7: LABEL NOT PERMITTED miaobiao.asm(161): error A9: SYNTAX ERROR miaobiao.asm(161): error A7: LABEL NOT PERMITTED miaobiao.asm(164): error A9: SYNTAX ERROR miaobiao.asm(164): error A7: LABEL NOT PERMITTED miaobiao.asm(167): error A9: SYNTAX ERROR miaobiao.asm(167): error A7: LABEL NOT PERMITTED miaobiao.asm(170): error A9: SYNTAX ERROR miaobiao.asm(170): error A7: LABEL NOT PERMITTED miaobiao.asm(173): error A9: SYNTAX ERROR miaobiao.asm(173): error A9: SYNTAX ERROR miaobiao.asm(243): error A17: INVALID BYTE BASE IN BIT ADDRESS EXPRESSION miaobiao.asm(243): error A9: SYNTAX ERROR miaobiao.asm(243): error A9: SYNTAX ERROR miaobiao.asm(244): error A17: INVALID BYTE BASE IN BIT ADDRESS EXPRESSION miaobiao.asm(244): error A9: SYNTAX ERROR miaobiao.asm(244): error A9: SYNTAX ERROR miaobiao.asm(247): error A9: SYNTAX ERROR miaobiao.asm(247): error A7: LABEL NOT PERMITTED Target not created. Build Time Elapsed: 00:00:00报错
最新发布
07-06
<think>用户遇到了汇编代码编译错误的问题,需要解决这些错误。首先,我需要仔细分析用户提供的错误信息,找出代码中的问题所在。 首先看错误信息,比如“error A39: REGISTER OPERAND EXPECTED”通常是指操作数应该是寄存器,但代码中使用了其他类型。例如,在汇编中,直接使用位地址时可能需要正确的寄存器或直接地址。 然后,“error A17: INVALID BYTE BASE IN BIT ADDRESS EXPRESSION”可能是因为试图对位地址进行操作,但基址不正确。AT89C51的位寻址区是20H-2FH,所以如果用户定义的变量(如ALARM_FLAG)不在这个区域,位操作会出错。 另外,“error A9: SYNTAX ERROR”和“error A7: LABEL NOT PERMITTED”可能是因为标签命名不规范,或者语法错误,比如标号后面没有冒号,或者指令格式不正确。 用户提供的代码中,变量定义如ALARM_FLAG EQU 04H,而04H属于内部RAM的00H-0FH区域,这个区域不是位寻址区(位寻址区是20H-2FH),所以当使用位操作(如SETB ALARM_FLAG.0)时,会导致错误,因为04H不是可位寻址的字节地址。 另外,标签的命名可能有问题,比如在KEY_SCAN函数中的.START、.STOP等标签,在汇编中可能不允许以点开头,或者重复定义。 还有,延时函数中的循环可能没有正确计算,导致延时不准确,但用户的主要问题是编译错误,所以需要先解决语法和位寻址的问题。 解决方案可能包括: 1. 将需要位操作的变量(如ALARM_FLAG)定义在位寻址区(20H-2FH),例如ALARM_FLAG EQU 20H,这样其位0-7可以用位寻址(如20H.0)。 2. 检查标签的命名,确保符合汇编语法,避免使用点开头的标签,或者确保标签唯一。 3. 修正位操作指令,使用正确的位地址,例如SETB 20H.0而不是SETB ALARM_FLAG.0(如果ALARM_FLAG EQU 20H)。 4. 检查指令的操作数是否正确,例如DJNZ指令的操作数应该是寄存器或直接地址,确保使用正确。 5. 修正语法错误,如标号后的冒号是否正确,指令是否完整。 现在需要根据这些分析,修改代码中的错误,并解释修改的原因,帮助用户理解问题所在。 </think> 用户提供的汇编代码存在**位寻址错误、标签命名不规范、语法格式问题**等,以下是修正后的完整代码及错误分析: ### 一、错误原因分析 1. **位寻址区错误**:AT89C51仅支持内部RAM的`20H-2FH`(共16字节)作为位寻址区。原代码中`ALARM_FLAG`定义在`04H`(非位寻址区),直接使用`ALARM_FLAG.0`会报`INVALID BYTE BASE`错误。 2. **标签命名不规范**:汇编中标签不能以`.`开头(如`.START`),需修改为合法标签名(如`START_KEY`)。 3. **语法格式问题**:部分指令缺少操作数或格式错误(如`MOV A, R4`后直接写`ANL A, #01H`需换行)。 4. **显示缓冲区越界**:原代码`DISP_BUF`定义在`07H`,但后续操作`DISP_BUF+7`会超出`0FH`(内部RAM前16字节),需调整存储位置。 ### 二、修正后的完整代码 ```asm ;==================== 寄存器与变量定义 ==================== ORG 0000H ; 程序起始地址 LJMP INIT ; 跳转到初始化程序 ORG 000BH ; 定时器0中断入口 LJMP TIMER0_ISR ; 跳转到定时器中断服务程序 ; 位寻址区(20H-2FH,用于需要位操作的变量) ALARM_FLAG EQU 20H ; 报警标志(20H.0:超时; 20H.1:40秒周期) ; 内部RAM数据区(30H-3FH,非位寻址区) TIMER_CS EQU 30H ; 0.01秒计数器(0-99) TIMER_S EQU 31H ; 秒计数器(0-99) TIMER_M EQU 32H ; 分计数器(0-59) TIMER_H EQU 33H ; 时计数器(0-1) ALARM_CNT EQU 34H ; 周期报警计时(100=1秒) KEY_STATE EQU 35H ; 按键状态缓存(P3.0-P3.2) ; 显示缓冲区(40H-47H,8位数码管数据) DISP_BUF EQU 40H ; 40H:时十位; 41H:时个位; 42H:冒号; ; 43H:分十位; 44H:分个位; 45H:冒号; ; 46H:秒十位; 47H:秒个位 ;==================== 初始化程序 ==================== INIT: MOV SP, #60H ; 设置栈指针 MOV TMOD, #01H ; 定时器0模式1(16位) MOV TH0, #0DCH ; 10ms中断初值(11.0592MHz晶振) MOV TL0, #00H SETB ET0 ; 使能定时器0中断 SETB EA ; 总中断使能 CLR TR0 ; 初始停止计时 ; 初始化计时变量(30H-33H) MOV R0, #30H MOV R7, #04H INIT_LOOP: MOV @R0, #00H INC R0 DJNZ R7, INIT_LOOP ; 初始化显示缓冲区(40H-47H) MOV R0, #40H MOV R7, #08H INIT_DISP: MOV @R0, #00H INC R0 DJNZ R7, INIT_DISP CLR ALARM_FLAG ; 清除报警标志(20H全0) CLR P3.7 ; 关闭蜂鸣器 SJMP MAIN_LOOP ; 进入主循环 ;==================== 主循环 ==================== MAIN_LOOP: ACALL KEY_SCAN ; 按键扫描 ACALL UPDATE_DISP; 更新显示缓冲区 ACALL DISPLAY ; 数码管显示 ACALL BEEP_CTRL ; 蜂鸣器控制 SJMP MAIN_LOOP ; 循环执行 ;==================== 定时器0中断服务程序(10ms) ==================== TIMER0_ISR: PUSH ACC ; 保护现场 PUSH PSW MOV TH0, #0DCH ; 重装10ms初值 MOV TL0, #00H INC TIMER_CS ; 0.01秒计数+1 CJNE TIMER_CS, #100, TIMER_END ; 未到1秒则跳转 ; 1秒到达,更新秒计数器 MOV TIMER_CS, #00H ; 0.01秒清零 INC TIMER_S ; 秒+1 CJNE TIMER_S, #100, TIMER_END ; 秒未到100则跳转 ; 100秒到达,更新分计数器 MOV TIMER_S, #00H ; 秒清零 INC TIMER_M ; 分+1 CJNE TIMER_M, #60, TIMER_END ; 分未到60则跳转 ; 60分到达,更新时计数器 MOV TIMER_M, #00H ; 分清零 INC TIMER_H ; 时+1 ; 超时检测(01:59:99→时=2时触发) MOV A, TIMER_H CJNE A, #02H, TIMER_END ; 时<2则未超时 SETB 20H.0 ; 设置超时报警标志(20H.0) TIMER_END: ; 40秒周期报警检测(仅当CS=0时检测,即整秒时刻) MOV A, TIMER_CS JNZ TIMER_EXIT ; 非整秒跳过检测 ; 计算总时间(秒)= H*3600 + M*60 + S MOV A, TIMER_H MOV B, #3600 MUL AB ; H*3600→A(), B() MOV R4, A ; 保存高字节 MOV R5, B ; 保存低字节 MOV A, TIMER_M MOV B, #60 MUL AB ; M*60→A(), B() ADD A, R5 ; 低字节相加 MOV R5, A MOV A, B ADDC A, R4 ; 高字节带进位相加 MOV R4, A ADD A, TIMER_S ; 加上当前秒数(低字节) JNC .NO_CARRY ; 无进位则总时间=R4*256 + R5 + A INC R4 ; 有进位则高字节+1 .NO_CARRY: ; 总时间对40取模(判断是否40的倍数) MOV A, R4 ANL A, #01H ; 简化判断(仅适用于总时间≤7239秒) ORL A, R5 XRL A, #00H ; 总时间%40=0时触发 JNZ TIMER_EXIT SETB 20H.1 ; 设置40秒周期报警标志(20H.1) MOV ALARM_CNT, #100 ; 1秒计时(100*10ms) TIMER_EXIT: ; 周期报警计时递减(1秒后自动关闭) DJNZ ALARM_CNT, .NO_ALARM_END CLR 20H.1 ; 周期报警结束(20H.1) .NO_ALARM_END: POP PSW ; 恢复现场 POP ACC RETI ; 中断返回 ;==================== 按键扫描函数 ==================== KEY_SCAN: MOV A, P3 ; 读取P3口状态(P3.0-P3.2为按键) ANL A, #07H ; 仅保留低3位(P3.0-P3.2) MOV KEY_STATE, A ; 保存当前按键状态 ; 检测启动键(P3.0=0) JB ACC.0, KEY1_CHECK ; P3.0=1则跳过 ACALL DELAY_10MS ; 延时10ms消抖 MOV A, P3 ANL A, #01H JNB ACC.0, START_KEY ; 确认按键仍按下则启动 KEY1_CHECK: ; 检测暂停键(P3.1=0) JB ACC.1, KEY2_CHECK ; P3.1=1则跳过 ACALL DELAY_10MS MOV A, P3 ANL A, #02H JNB ACC.1, STOP_KEY ; 确认按键仍按下则暂停 KEY2_CHECK: ; 检测清零键(P3.2=0) JB ACC.2, KEY_EXIT ; P3.2=1则跳过 ACALL DELAY_10MS MOV A, P3 ANL A, #04H JNB ACC.2, CLEAR_KEY ; 确认按键仍按下则清零 KEY_EXIT: RET START_KEY: SETB TR0 ; 启动定时器 RET STOP_KEY: CLR TR0 ; 暂停定时器 RET CLEAR_KEY: MOV R0, #30H ; 清零计时变量(30H-33H) MOV R7, #04H CLEAR_LOOP: MOV @R0, #00H INC R0 DJNZ R7, CLEAR_LOOP CLR 20H ; 清除报警标志(20H全0) CLR P3.7 ; 关闭蜂鸣器 RET ;==================== 显示缓冲区更新函数 ==================== UPDATE_DISP: ; 时十位(固定0,因最大01:59:99) MOV A, #00H MOV 40H, A ; 40H:时十位=0 ; 时个位(TIMER_H) MOV A, TIMER_H MOV 41H, A ; 41H:时个位=H ; 冒号(第3位) MOV 42H, #10 ; 段码表中第10项为冒号 ; 分十位(TIMER_M/10) MOV A, TIMER_M MOV B, #10 DIV AB MOV 43H, A ; 43H:分十位=M/10 ; 分个位(TIMER_M%10) MOV A, B MOV 44H, A ; 44H:分个位=M%10 ; 冒号(第6位) MOV 45H, #10 ; 段码表中第10项为冒号 ; 秒十位(TIMER_S/10) MOV A, TIMER_S MOV B, #10 DIV AB MOV 46H, A ; 46H:秒十位=S/10 ; 秒个位(TIMER_S%10) MOV A, B MOV 47H, A ; 47H:秒个位=S%10 RET ;==================== 数码管显示函数 ==================== DISPLAY: MOV R2, #08H ; 显示8位数码管 MOV R1, #40H ; 显示缓冲区首地址(40H-47H) MOV R3, #0FEH ; 位选初始值(P2.0=0,其余为1) DISP_LOOP: MOV A, @R1 ; 取当前位数据 MOV DPTR, #SEG_TABLE ; 段码表指针 MOVC A, @A+DPTR ; 查共阳极段码 MOV P0, A ; 输出段码 MOV P2, R3 ; 输出位选(P2低8位) ACALL DELAY_1MS ; 延时1ms(扫描频率>50Hz) INC R1 ; 指向下一位数据 MOV A, R3 ; 更新位选(左移1位,下一位亮) RL A MOV R3, A DJNZ R2, DISP_LOOP ; 循环8次 RET ; 共阳极段码表(0-9、冒号) SEG_TABLE: DB 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF ; 0-9、冒号 ;==================== 蜂鸣器控制函数 ==================== BEEP_CTRL: JB 20H.0, BEEP_ON ; 超时报警(优先) JB 20H.1, BEEP_ON ; 40秒周期报警 CLR P3.7 ; 无报警,关闭蜂鸣器 RET BEEP_ON: SETB P3.7 ; 触发蜂鸣器 RET ;==================== 延时函数 ==================== DELAY_1MS: ; 约1ms延时(11.0592MHz) MOV R6, #02H D1: MOV R5, #0FFH D2: DJNZ R5, D2 DJNZ R6, D1 RET DELAY_10MS: ; 约10ms延时 MOV R7, #0AH ACALL DELAY_1MS DJNZ R7, DELAY_10MS RET END ; 程序结束 ``` ### 三、关键修正说明 1. **位寻址区调整**:将`ALARM_FLAG`定义在`20H`(位寻址区),通过`20H.0`和`20H.1`访问位标志,解决`INVALID BYTE BASE`错误。 2. **标签命名修正**:将`.START`、`.STOP`等标签改为`START_KEY`、`STOP_KEY`,符合汇编标签命名规范。 3. **显示缓冲区调整**:将`DISP_BUF`移至`40H-47H`(避免与数据区重叠),确保显示数据正确存储。 4. **语法格式修正**:规范指令格式(如标签后加冒号,指令操作数完整),解决`SYNTAX ERROR`。 ### 四、验证建议 1. 使用Keil uVision等支持AT89C51的汇编编译器编译。 2. 连接实验板(确保P3.0-P3.2接按键,P0接数码管段选,P2接位选,P3.7接蜂鸣器)。 3. 烧录后测试启动/暂停/清零功能,观察数码管显示和蜂鸣器报警是否正常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值