2016-03-31 21 views
0

ile daha sonraki bir kullanım için birçok DB tablosuna erişim hazırlayın Spark ile ilk adımları yapıyorum ve bir veritabanından JDBC sürücüsü aracılığıyla bazı verileri içe aktarma yollarını arıyorum. Planım, saf SparkSQL komutlarına sahip başka bir ekipten daha sonra kullanılmak üzere DB'den birçok tablo için erişimi hazırladığımdur. Böylece, verilere odaklanabilir ve artık kodla hiç iletişim kuramazlar.Kıvılcım

DB ile bağlantım çalışıyor ve şu ana kadar iki veri yolunu buldum.

Yolu 1:

sqlContext.read.jdbc(url,"tab3",myProp).registerTempTable("tab3") 

Yolu 2:

case class RowClass_TEST (COL1:String, COL2:String) 
val myRDD_TEST= new JdbcRDD(sc,() => DriverManager.getConnection(url,username,pw), "select * from TEST where ? < ?", 0,1,1,row => RowClass_TEST(row.getString("COL1"),row.getString("COL2")) myRDD_TEST.toDF().registerTempTable("TEST") 

Ancak her iki yolu bazı kötü etkileri vardır,

Yolu 1 kadar hızlı daha yüksek miktarda hazırlamak varsa değil Daha sonra kullanılmayan tabloların

yol 2 çalışmaları çok hızlı (I bağlantı oluşturmak (örneğin yürütülmesi sırasında 5 JDBC komando iz, giriş, ayarlar, başlık için sorgu) bağlantıyı sonlandırmak), ancak Scala case class ağır sınırlama hast.
Yalnızca 22 değeri bu tür bir sınıfla kurabilirsiniz.

case class olmadan kurulum yolu 2 için kolay bir çözüm var mı?
22'den fazla sütun içeren bazı DB tablolarına erişmek istiyorum.

Zaten çalışmayı denedim, ancak Scala bilgim henüz yeterince iyi değil.

+0

_You can sadece kurulum class_ bu tür 22 değerleri - şimdi uzun bir süredir doğru değildir. – zero323

+0

Ah, kulağa hoş geliyor. Bir Zeppelin Web GUI'sini testlerim için bir ön uç olarak kullanıyorum ve büyük "case class" dan bir hata mesajı (sadece bir sayı) alıyorum. Kenarlık daha yeni bir Scala sürümü ile kaldırıldı mı? – Xaltos

+0

2.11 - https://issues.scala-lang.org/browse/SI-7296. Yine de 22 tane sınır mevcut. – zero323

cevap

1

Böyle bir şey yazabilirsiniz:

sqlContext.load("jdbc", 
     Map(
     "url" -> "jdbc:mysql://dbConnectionString", 
     "dbtable" -> 
      "(SELECT * FROM someTable WHERE someField > 10) AS a" 
     ) 
    ).registerTempTable("tmp_table") 
+0

Yayınınız için teşekkürler. Sadece bu kodu test ettim ve yukarıdaki yolun eski bir sözdizimi gibi görünüyor. Tam olarak aynı şekilde davranır. Ayrıca wireshark'taki 5 jdbc komutunu da görüyorum. Ama ondan da bir şey öğrendim. Alt komutlu sürüm sonraki adımlarıma yardımcı olabilir: D – Xaltos

+0

Bu alt sorguda, çalışacağınız veri miktarını en aza indirgeyebilirsiniz. – gabriel9

+0

Sorunumun cevabı değil, ama haklısın. Bu çok değerli bir ipucu, çünkü doğru filtreli erişimi çok hızlandırabilir. Sadece bir sqlContext.read.jdbc() işleviyle test ettim ve orada da çalışıyor. – Xaltos