Microsoft SQL Server (및 oracle, mysql 등)의 데이터를 Spark 응용 프로그램의 rdd로 읽을 수 있습니까? 또는 메모리 세트를 만들고이를 RDD에 parallize해야합니까?Spark SQL을 사용하여 SQL Server에서 데이터 읽기
답변
메일 링리스트에서 해결책을 찾았습니다. 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+ 스파크에서
.
위에 게시 된 솔루션에 상응하는
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
이 거 확실히 답이 될 수있다 : P – khandelwaldeval
그렇게 보인다 ... 어떤 이유 왜? 모든 것에서 데이터를 가져올 수 있다면 가장 일반적인 상점이 아닌 이유는 무엇입니까? – ashic
태그'apache-spark'는 매우 엄숙하게 사용되므로 며칠을 기다려야합니다. 아파치 친구들이 귀하의 질문에 답변 할 수 있도록 며칠 정도 기다려주십시오. – khandelwaldeval