sqoop 가져 오기에 이상한 문제가 있습니다. 내가 가져 오기 위해 노력하고있어 데이터는 MySQL을 DB에 다음과 같은 형태 : A1, A2, ..., A8은 VARCHAR 타입과 D1의이다sqoop 자유 형식 쿼리 오류가 발생했습니다.
<a1, a2, a3, d1, a4, a5, a6, a7, a8>
타임 스탬프 형식입니다. 데이터의 정상화로 인해, 나는 이러한 열을 얻기 위해 여러 테이블을 가입해야했다 - 다음과 같은 것을 :
CREATE OR REPLACE VIEW my_view AS
SELECT t1.a1, t2.a2....... from table t1 INNER JOIN table t2 ON t1.t2_id = t2.id ........... WHERE <some condition>
Sqoop을 :
SELECT t1.a1, t2.a2....... from table t1 INNER JOIN table t2 ON t1.t2_id = t2.id ........... WHERE <some condition>
가 처음에 나는이 같은 전망 시작 명령은 다음과 같이이보기를 사용하여 가져올 수 있습니다.
sqoop import --connect [jdbc url] --username [user] --password [password] --table my_view --target-dir my_dir --split-by a5 --mysql-delimiters --verbose --boundary-query 'SELECT min(a5), max(a5) from t5'
이 작동합니다. MySQL보기가 원하는만큼 최적화되지 않았기 때문에 원시 SQL을 사용하여 성능 향상 여부를 확인하고자했습니다. 이를 테스트하려면, 내가 대신 자유 형식 쿼리를 사용 :
sqoop import --connect [jdbc url] --username [user] --password [password] --query "SELECT t1.a1, t2.a2....... from table t1 INNER JOIN table t2 ON t1.t2_id = t2.id ............ WHERE <some condition> AND \$CONDITIONS" --target-dir my_dir --split-by a5 --mysql-delimiters --verbose --boundary-query 'SELECT min(a5), max(a5) from t5'
을 그래서이 경우 --query 매개 변수에 효과적으로 Sqoop을 요구하는 뷰 정의 SELECT 문 플러스 $ 조건이있다. 그러나 이것은 작동하지 않습니다.
13/09/27 20:28:10 INFO mapred.JobClient: Task Id : attempt_201309130032_0122_m_000000_2, Status : FAILED
java.io.IOException: SQLException in nextKeyValue
at org.apache.sqoop.mapreduce.db.DBRecordReader.nextKeyValue(DBRecordReader.java:265)
at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:531)
at org.apache.hadoop.mapreduce.MapContext.nextKeyValue(MapContext.java:67)
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:764)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364)
at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
at org.apache.hadoop.mapred.Child.main(Child.java:249)
Caused by: java.sql.SQLException: Value 'xxxxxx' can not be represented as java.sql.Timestamp
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
at com.mysql.jdbc.ResultSetRow.getTimestampFast(ResultSetRow.java:1102)
at com.mysql.jdbc.BufferRow.getTimestampFast(BufferRow.java:576)
at com.mysql.jdbc.ResultSetImpl.getTimestampInternal(ResultSetImpl.java:6592)
at com.mysql.jdbc.ResultSetImpl.getTimestamp(ResultSetImpl.java:6192)
at org.apache.sqoop.lib.JdbcWritableBridge.readTimestamp(JdbcWritableBridge.java:111)
at com.cloudera.sqoop.lib.JdbcWritableBridge.readTimestamp(JdbcWritableBridge.java:83)
at QueryResult.readFields(QueryResult.java:156)
at org.apache.sqoop.mapreduce.db.DBRecordReader.nextKeyValue(DBRecordReader.java:245)
... 11 more
이 는 지금까지 내가, Sqoop을 타임 스탬프 같은 다른 열 (A3) 값을 해석하려고 말할 수있는 그 변환이 실패로가 단지
이후 : 수입을 절반 기록을 Sqoop을 다음과 같은 이상한 오류와 함께 실패 문자열이며 날짜 유형이 아닙니다. 또한 데이터의 일부가 잘못되었음을 언급해야합니다. 일부 필드에는 개행과 탭이 있지만 날짜 필드에는 유효한 값이 있습니다. 심지어 MySQL에서 REPLACE 함수를 사용하여 이러한 데이터를 제거하려고했지만 그것은 쓸모가 없다.
데이터가 동일하고 두 경우 모두 동일한 SELECT 문이 사용되는 경우 동일한 결과 (예 : SELECT에서 반환 한 레코드 수와 HDFS로 가져 오는 레코드 수)가 같을 것으로 예상했습니다.
이전에이 동작을 본 사람이 있습니까? 이 문제를 어떻게 해결할 수 있는지에 대한 아이디어가 있습니까?
에 대한이 작품? 당신은 대답으로 그것을 제공해야하고, 당신 자신의 대답을 받아 들여야합니다. (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/). 이렇게하면 질문이 해결 된 것으로 표시됩니다. – Freerobots
나는 내 자신의 질문에 대답 할 수 있다는 것을 몰랐다. 포인터 주셔서 감사. – srikrishna