与卡桑德拉的sparkR

时间:2015-10-17 22:57:39

标签: cassandra apache-spark sparkr

我想读取来自cassandra键空间和column_family的数据帧。当运行sparkR时,我调用相应的spark-cassandra-connector包,并将conf设置为我的本地spark cassandra主机。运行以下内容时,我没有收到任何错误。

Private Sub Update_Click()
    Dim wb As Workbook, ur1 As Range, ur2 As Range, i As Long
    Dim fr1 As Long, fr2 As Long, lr1 As Long, lr2 As Long, lc1 As Long, lc2 As Long

    Application.ScreenUpdating = False

    Set wb = Workbooks.Open("E:\mysourcefile.xlsm")
    Set ur1 = Me.UsedRange
    Set ur2 = wb.Worksheets("mysourcesheet").UsedRange

    fr1 = ur1.Row: lr1 = fr1 + (ur1.Rows.Count - 1) - 1
    fr2 = ur2.Row: lr2 = fr2 + (ur2.Rows.Count - 1) - 1
    lc1 = ur1.Column + ur1.Columns.Count - 2:   lc2 = ur2.Column + ur2.Columns.Count - 1

    If Len(ur2.Cells(fr1 + 1, lc2)) > 0 Then                       'customer not empty
        If ur1.Cells(fr1 + 1, lc1) <> ur2.Cells(fr1 + 1, lc2) Then 'if last cutomer differ
            With ur1
              .Cells(fr1 + 0, lc1 + 2) = ur2.Cells(fr2 + 0, lc2)
              .Cells(fr1 + 1, lc1 + 2) = ur2.Cells(fr2 + 1, lc2)
              .Range(.Cells(fr1 + 0, lc1 + 2), .Cells(fr1 + 0, lc1 + 3)).MergeCells = True
              .Range(.Cells(fr1 + 1, lc1 + 2), .Cells(fr1 + 1, lc1 + 3)).MergeCells = True
              .Cells(fr1 + 2, lc1 + 2) = "Target"
              .Cells(fr1 + 2, lc1 + 3) = "Actual"
              .Cells(fr1 + 2, lc1 + 2).ColumnWidth = .Cells(fr1 + 2, lc1).ColumnWidth
              .Cells(fr1 + 2, lc1 + 3).ColumnWidth = .Cells(fr1 + 2, lc1).ColumnWidth
    .Range(.Cells(fr1, lc1 + 2), .Cells(fr1 + 2, lc1 + 3)).HorizontalAlignment = xlCenter
    .Range(.Cells(fr1, lc1 + 2), .Cells(lr1 + 1, lc1 + 3)).Borders.Weight = xlThin
              For i = fr1 + 3 To lr1 + 1
                  .Cells(i, lc1 + 2) = Now  'Target date
                  .Cells(i, lc1 + 3) = ur2.Cells(i - 1, lc2)
              Next
            End With
        End If
    End If
    wb.Close False
    Application.ScreenUpdating = True
End Sub
$ ./bin/sparkR --packages com.datastax.spark:spark-cassandra-connector_2.10:1.5.0-M2 --conf spark.cassandra.connection.host=127.0.0.1

我收到以下错误,

sc <- sparkR.init(master="local")
sqlContext <- sparkRSQL.init(sc)
people <-read.df(sqlContext,
    source = "org.apache.spark.sql.cassandra",
    keyspace = "keyspace_name", table = "table_name")

我是否必须将conf传递给Error in writeJobj(con, object) : invalid jobj 1 作业(sc),以及如何使用sparkR?

以下是我的spark和cassandra版本,

Spark:1.5.1 卡珊德拉:2.1.6 Cassandra Connector已更新为每个zero323建议使用1.5.0-M2

这是我的堆栈跟踪的要点。

https://gist.github.com/bhajer3/419561edcb0dc5db2f71

修改

我能够从不包含任何Cassandra集合数据类型的表创建数据框, 例如Map,Set和List。但是,我需要数据的许多模式都包含这些集合数据类型。

因此,当读取来自Cassandra键空间和column_family的数据帧时,sparkR不支持cassandra集合数据类型。请参阅此处了解我的详细报告/测试程序。

https://gist.github.com/bhajer3/c3effa92de8e3cfc4fee

1 个答案:

答案 0 :(得分:1)

最初的问题

一般来说,你必须匹配Spark,spark-cassandra-connector和Cassandra版本。连接器版本应与主要的Spark版本匹配(Spark 1.5的连接器1.5,Spark 1.4的连接器1.4,等等)。

与Cassandra版本的兼容性稍微有些棘手但您可以在connector README.md中找到兼容版本的完整列表。

修改

SparkR&lt; 1.6不支持收集包括数组或映射在内的复杂数据类型。它已由SPARK-10049解决。如果您构建Spark表单master,它将按预期工作。 1.6版本没有cassandra-connector但1.5-M2似乎运行得很好,至少使用DataFrame API。

注意

看起来连接器1.5-M2错误地将Date密钥报告为Timestamps所以请注意,如果您在数据库中使用这些密钥。