2014-10-07 2 views
9

Microsoft SQL Server (및 oracle, mysql 등)의 데이터를 Spark 응용 프로그램의 rdd로 읽을 수 있습니까? 또는 메모리 세트를 만들고이를 RDD에 parallize해야합니까?Spark SQL을 사용하여 SQL Server에서 데이터 읽기

+1

이 거 확실히 답이 될 수있다 : P – khandelwaldeval

+0

그렇게 보인다 ... 어떤 이유 왜? 모든 것에서 데이터를 가져올 수 있다면 가장 일반적인 상점이 아닌 이유는 무엇입니까? – ashic

+0

태그'apache-spark'는 매우 엄숙하게 사용되므로 며칠을 기다려야합니다. 아파치 친구들이 귀하의 질문에 답변 할 수 있도록 며칠 정도 기다려주십시오. – khandelwaldeval

답변

5

메일 링리스트에서 해결책을 찾았습니다. JdbcRDD를 사용하여이를 수행 할 수 있습니다. MS Sql Server JDBC 드라이버 jar를 가져와 내 프로젝트의 lib에 추가해야했습니다. 통합 보안을 사용하기를 원했고 java.library.path가 볼 수있는 위치에 sqljdbc_auth.dll (동일한 다운로드에서 사용 가능)을 배치해야했습니다. 다음에, 코드는 다음과 같다 :

 val rdd = new JdbcRDD[Email](sc, 
     () => {DriverManager.getConnection(
"jdbc:sqlserver://omnimirror;databaseName=moneycorp;integratedSecurity=true;")}, 
      "SELECT * FROM TABLE_NAME Where ? < X and X < ?", 
      1, 100000, 1000, 
      (r:ResultSet) => { SomeClass(r.getString("Col1"), 
      r.getString("Col2"), r.getString("Col3")) }) 

이것은 필요 SomeClass.The 두 ​​번째, 세 번째 및 네 번째의 파라미터를 제공하고 RDD 상한 및 하한에 대한 것이고 파티션의 수. 다시 말해, 소스 데이터는이를 작동시키기 위해 long으로 파티션 할 수 있어야합니다. 당신은 지금 당신에게 대신 RDD 행의 객체의 DataFrame을 줄 것이다 sqlContext.read.jdbc

을 사용할 수 있습니다 1.4.0+ 스파크에서

5

.

위에 게시 된 솔루션에 상응하는

sqlContext.read.jdbc("jdbc:sqlserver://omnimirror;databaseName=moneycorp;integratedSecurity=true;", "TABLE_NAME", "id", 1, 100000, 1000, new java.util.Properties)

이 테이블의 스키마를 선택해야하지만, 당신이 그것을 강제하려는 경우, 당신은 후 스키마 방법을 사용할 수 있습니다 읽기 sqlContext.read.schema(...insert schema here...).jdbc(...rest of the things...)

여기서 SomeClass의 RDD를 얻지는 않습니다 (내보기에는 더 좋음). 대신 관련 필드의 DataFrame을 가져옵니다.

자세한 내용은 여기에서 찾을 수 있습니다 : http://spark.apache.org/docs/latest/sql-programming-guide.html#jdbc-to-other-databases

관련 문제