小编Dav*_*rio的帖子

从Scala Breeze中的文件中读取矩阵

我想将制表符分隔的文本文件读入Breeze DenseMatrix.我在ScalaDoc中看到这应该是可能的,并且有一整套I/O类,但我找不到任何示例,并且很难消化ScalaDoc.

有人可以提供简单的读/写示例吗?

scala scalala scala-breeze

6
推荐指数
2
解决办法
2287
查看次数

在Spark(一个RedShift)中是否有用于高效连接的数据架构?

我有数据,我想做很多分析查询,我想弄清楚是否有一个机制,我可以用来存储它,以便Spark可以有效地对它进行连接.我有一个使用RedShift的解决方案,但理想情况下更喜欢在S3中使用基于文件的内容,而不是全天候提供整个RedShift群集.

数据简介

这是一个简化的例子.我们有2个初始CSV文件.

  • 人员记录
  • 事件记录

这两个表通过person_id字段链接.person_id在Person表中是唯一的.事件与人有多对一的关系.

目标

我想了解如何设置数据,以便我可以有效地执行以下查询.我需要执行这样的许多查询(所有查询都是基于每个人进行评估):

查询是生成一个包含4列的数据框,每个人都有1行.

  • person_id - 数据集中每个人的person_id
  • 年龄 - 来自人员记录的"年龄"字段
  • 成本 - "日期"在2013年6月期间该人员的所有事件记录的"成本"字段的总和

我在解决这个问题时使用Spark的所有当前解决方案都涉及重新调整所有数据,最终导致大量(数亿人)的流程变慢.我很高兴有一个解决方案,要求我重新整理数据并将其写入不同的格式,如果这样可以加快以后的查询速度.

使用RedShift的解决方案

我可以使用RedShift以相当简单的方式完成此解决方案:

每个文件都作为RedShift表加载,使用DISTKEY person_id,SORTKEY person_id.这会分发数据,以便人员的所有数据都在一个节点上.以下查询将生成所需的数据框:

select person_id, age, e.cost from person 
    left join (select person_id, sum(cost) as cost from events 
       where date between '2013-06-01' and '2013-06-30' 
       group by person_id) as e using (person_id)
Run Code Online (Sandbox Code Playgroud)

使用Spark/Parquet的解决方案

我已经想到了几种在Spark中处理这个问题的潜在方法,但是没有一种能够实现我的需求.我的想法和问题如下:

  • Spark数据集写'bucketBy' - 读取CSV文件,然后使用"bucketBy"将它们重写为镶木地板文件.这些镶木地板文件的查询可能非常快.这将生成类似于RedShift的数据设置,但镶木地板文件不支持bucketBy.
  • Spark镶木地板隔断 - Parquet确实支持分区.因为为每个分区键创建一个单独的文件集,您必须创建一个要分区的计算列,并使用person_id的哈希来创建partitionKey.但是,当您稍后在基于"partition_key"和"person_id"的spark中加入这些表时,查询计划仍会执行完整的散列分区.因此,这种方法并不比只读取CSV并每次都进行改组更好.
  • 存储在除镶木地板之外的其他一些数据格式 - 我对此持开放态度,但不知道其他可用的数据源.
  • 使用复合记录格式 - Parquet支持分层数据格式,因此可以将两个表预加入分层记录(其中人员记录具有"事件"字段,这是一个结构元素数组),然后对其进行处理.当您有分层记录时,有两种方法可以处理它:
    • **使用explode创建单独的记录** - 使用此方法将阵列字段分解为完整行,然后使用标准数据框操作进行分析,然后将它们连接回主表.不幸的是,我一直无法使用这种方法来有效地编译查询.
    • **使用UDF对子记录执行操作** - 这样可以保留结构并执行而不需要随机播放,但这是一种笨拙且冗长的编程方式.此外,它需要大量的UDF,这些UDF对性能不是很好(尽管它们击败了大规模的数据混乱).

对于我的用例,Spark优于RedShift,这在这个简单的例子中并不明显,所以我更喜欢用Spark做这个.如果我遗漏了一些东西并且有一个很好的方法,请告诉我.

amazon-redshift apache-spark apache-spark-sql spark-dataframe

5
推荐指数
1
解决办法
510
查看次数

在mongo3升级之后,获取"未授权对db.collection'(code = 13)进行查询的DatabaseException

我使用免费的MongoLab,我的数据库在周末升级到Mongo 3,现在我的客户端无法连接.我一直收到'未经授权的db.collection查询'.错误.

Mongolab说我应该使用Mongo 3兼容驱动程序(http://docs.mongodb.org/manual/release-notes/3.0-compatibility/#driver-compatibility-changes).我正在使用scala ReactiveMongo客户端,版本0.11.7,它应该支持Mongo 3.

mongodb mlab reactivemongo

4
推荐指数
1
解决办法
2364
查看次数

Windows上的Python Avro给ord()预期一个字符,但找到了长度为0的字符串

我正在尝试使用Java编写Avro序列化文件,然后在Windows上使用Python读取它.我能够使用Java写出Avro文件,但是当我尝试使用Python读取它时,我得到一个错误"ord()期望一个字符,但找到长度为0的字符串"

文件不完整或不刷新不是错误,因为我可以完全通过Java读取文件并且读取正常.

我的python设置不是一个基本错误,因为我可以在Avro入门页面上运行示例序列化/反序列化:http://avro.apache.org/docs/current/gettingstartedpython.html

任何想法可能是什么.

avro

3
推荐指数
1
解决办法
1165
查看次数

在Scala.JS中有一个调用来获取我正在运行的平台吗?

我有一些Scala代码用于库,我为JVM和ScalaJS编译.

现在我有一个"纯"项目,在js和jvm项目中没有特殊代码,我想保持这种方式,因为intellij集成和其他一些因素.

但是,我确实需要根据我是在JVM还是JS中来改变一小段代码(1-2行).我想要一个简单的方法来实现这一点,这不需要我改变我的整个项目结构.

基本上我想要一个调用"isJS",如果我使用JavaScript则返回true,否则返回false.

scala.js

1
推荐指数
1
解决办法
98
查看次数

如何在Spark中检索DataFrame的别名

我正在使用Spark 2.0.2.我有一个在其上有别名的DataFrame,我希望能够检索它.我想要的简化示例如下.

def check(ds: DataFrame) = {
   assert(ds.count > 0, s"${df.getAlias} has zero rows!")    
}
Run Code Online (Sandbox Code Playgroud)

上面的代码当然失败了,因为DataFrame没有getAlias函数.有没有办法做到这一点?

apache-spark apache-spark-sql

1
推荐指数
1
解决办法
732
查看次数