2017-12-02 10 views
2

이 기능이 작동하지 않는 이유는 모르겠지만 아래에서 적용했지만 여전히 varchar (128) 대신 text이 포함 된 테이블 (mysql)에 대한 스키마의 스파크 버전을 얻으려고합니다.) 지정하려고합니다. jdbc write로 내 컬럼에 대한 사용자 정의 데이터 유형을 작성하려고합니다. 스파크 2.1.0로 시도 :Spark createTableColumnTypes가 사용자가 제공 한 스키마가 아닌 것

def df2DB(
    df: DataFrame, 
    batchSize: Int, 
    numPartitions: Int, 
    database: String, 
    table: String): Unit = { 

    val mdb = new MetadataBuilder() 
    mdb.putString("col1", "INT") 
    mdb.putString("col2", "VARCHAR(128)") 
    mdb.putString("col3", "VARCHAR(128)") 
    val createTableColTypes = mdb.build().json 

    df.write.format("jdbc") 
     .option("createTableColumnTypes", createTableColTypes) 
     .option("url", url) 
     .option("dbtable", s"${database}.${table}") 
     .option("user", user) 
     .option("password", pass) 
     .option("driver", driver) 
     .option("batchsize", batchSize) 
     .option("numPartitions", numPartitions) 
     .save() 
    } 

가 나는 또한 성공없이이 형식을 시도 : 나는이 SQL 구문 오류가 발생하고있어이 같은 createTableOptions를 사용하려고하는 경우에도

또한
df.write.format("jdbc") 
    .mode(SaveMode.Overwrite) 
    .option("url", url) 
    .option("dbtable", s"${database}.${table}") 
    .option("user", user) 
    .option("password", pass) 
    .option("driver", driver) 
    .option("batchsize", batchSize) 
    .option("numPartitions", numPartitions) 
    .option("createTableColumnTypes", "COL1 INT, COL2 VARCHAR(128)") 
    .save() 

. 나도 함께 또는 개별적으로 이러한 옵션을 사용의 좋은 예를 찾는 아니에요 :

.option("createTableOptions", "CREATE TABLE tbl1 (col1 int, col2 VARCHAR(128))").save() 

답변

0

를 대신 데이터 형식에 열 이름의 JSON을 만드는, 쉼표 같은 데이터 유형 뭔가 열 이름의 목록을 분리 사용해보십시오 :

def df2DB(
    df: DataFrame, 
    batchSize: Int, 
    numPartitions: Int, 
    database: String, 
    table: String): Unit = { 

    df.write.format("jdbc") 
     .option("createTableColumnTypes", "col1 INT, col2 VARCHAR(128), col3 VARCHAR(128)") 
     .option("url", url) 
     .option("dbtable", s"${database}.${table}") 
     .option("user", user) 
     .option("password", pass) 
     .option("driver", driver) 
     .option("batchsize", batchSize) 
     .option("numPartitions", numPartitions) 
     .save() 
    } 

참조 : https://github.com/apache/spark/blob/aa4cf2b19e4cf5588af7e2192e0e9f687cd84bc5/examples/src/main/python/sql/datasource.py#L210

+0

감사합니다. 그것도 시도했지만 행운은 없다. 쓰기 후에도 int와 텍스트를 데이터베이스에 저장합니다. 나는 또한 MetadataBuilder()를 사용하는 것이 Json을 생성하기위한 올바른 방법이라고 생각했다. MySqlDialect를 조정하여이 작업을 수행하도록 사용자 정의해야합니까? 난 그냥 jdbc 쓰기에서 이러한 속성을 사용할 수 있고 DB에 올바르게 매핑 될 것이라고 생각. – horatio1701d