
Daniel
28.12.2017
15:20:40
И опять же это не база, а набор алгоритмов.

Grigory
28.12.2017
15:22:05

Daniel
28.12.2017
15:22:08
Олапы вроде есть в сборках, но не работал сам и кухню не знаю.
Ну ? может много чего хотеть, но спарк живет прекрасно и без него.

Google

Grigory
28.12.2017
15:24:08
ну буквоедством на буквоедство знаешь ли)

Andrey
28.12.2017
15:26:07

sherzod
28.12.2017
15:27:39
насколько я понимаю в классическом виде нет, нет индексов, подсчеты агрегатов по разрезам не быстрые
под конкретный юзкейс конечно можно написать, но вряд ли олаписты думаю про это, там обычно все мышкой

Andrey
28.12.2017
15:28:41
ну разве если с позиции мышки..
так то есть партиции, стораджовые индексы, блум фильтры в орке. В конце концов никто не мешает работать с рбд из спарка

sherzod
28.12.2017
15:29:46
ну если не с позиции мышки, файлы тоже олап))) если прогу такую написать
под олап обычно понимают конкретные тулзы в которых накидываешь разрезы, потом жмешь билд, и выполняешь запросы

Andrey
28.12.2017
15:30:08
мы просто своих аналитиков приучили к спарк-шелу
они теперь не хотят ничего другого))

sherzod
28.12.2017
15:30:18
мы тоже)
вернее к zeppelin
SparkSQL их все

Saydiolim Ganiev
28.12.2017
15:58:49

Google

Alexey
28.12.2017
17:22:51
коллеги с прошлой работы пишут свой собственный олап на скале, поверх спарка. ну, не совсем поверх, скорее рядом.

Ilia
28.12.2017
17:31:32
Хороший вопрос как поверх спарка что-то писать

Andrey
28.12.2017
17:32:16

Grigory
28.12.2017
17:34:43
трифт конечно
лучший протокол

Ilia
28.12.2017
17:34:56
Ну и json rpc это перспектива получить ещё один ботлнек

ptchol
29.12.2017
13:14:15
А тинкерпоп или как там его не считается хадуповым ?

Alex
29.12.2017
20:43:27
Каким образом лучше переназначать типы в датасете спарковском?
Из примеров нашел вот такой, но выглядит костыльно
data = data.withColumn("_f1", data.col("_c1").cast("Double")).drop("_c1")

KrivdaTheTriewe
29.12.2017
20:48:46

Grigory
29.12.2017
20:49:46
датасеты используй)

KrivdaTheTriewe
29.12.2017
20:51:55
Rdd до последнего хотелось бы )

Alex
29.12.2017
20:55:38
Я csv читаю, использую
spark.read.format("csv")
.
Лучше через SQLcontext читать?

Andrey
30.12.2017
01:16:37
вручную можно с помощью .schema

KrivdaTheTriewe
30.12.2017
01:43:57
https://m.youtube.com/watch?v=Cpv6MD2ofyU

Google

Alex
30.12.2017
11:45:56
можно еще вот так .select(‘col1.cast(“Double”).alias(“col1”))
В конечном итоге надо было в вектора все затащить. Сделал вот так (data - это DataFrame)
val rdd = sc.parallelize(data.map(row => Array(row.getDouble(0), row.getDouble(1), row.getDouble(2), row.getDouble(3))).collect.map(x => Vectors.dense(x))).cache
Не подскажешь, есть какой-нибудь более приемлимый способ?

Andrey
30.12.2017
11:49:26
df.map { case Row(a: String, b:Int) => Vectors.dense(a.toDouble, b.toDouble) }
Alex
import o.a.s.s.Row не забудь)

Alex
30.12.2017
12:01:07
там внутри double
Он вообще пишет что я ему Any передаю. Уже кажется что легче переделать структуру файлов и сразу в RDD[Vector] читать.

Andrey
30.12.2017
12:22:55

Alex
30.12.2017
12:58:47

Andrey
30.12.2017
13:09:49
да, все именно так
Спасибо)
data.map { case Row(_c1: Double, _c2: Double, _c3: Double, _c4: Double) => Vectors.dense(_c1, _c2, _c3, _c4) }

Alex
30.12.2017
13:44:37

Andrey
30.12.2017
13:45:16
а он у тебя вываливается рантайме или при компиляции?

Alex
30.12.2017
13:47:36

Andrey
30.12.2017
13:48:44

Alex
30.12.2017
13:49:10
Сразу валится

Andrey
30.12.2017
13:57:48
ну да, спарк 2.х же
df.rdd.map { case Row(a: Int, b: Int) => Vectors.dense(a,b) }
пробуй, у меня получилось)

Google

Andrey
30.12.2017
13:58:52
import org.apache.spark.ml.linalg.Vectors
val rdd = sc.parallelize { (0 to 100).map(x => (x,x)) }
val df = rdd.toDF("a","b")
df.printSchema
import org.apache.spark.sql.Row
import spark.implicits._
df.rdd.map { case Row(a: Int, b: Int) => Vectors.dense(a,b) }

Alex
30.12.2017
14:02:07

Andrey
30.12.2017
14:02:34
незачто) сразу на будущее - не забудь про то, что если у тебя будут нулы в колонках, то в текущем виде это вывалится в исключение
поэтому либо .na.fill, либо na.drop, либо в мапе добавь дефолтный case _ на какой нибудь вектор)

Alex
30.12.2017
14:04:07

Andrey
30.12.2017
14:04:29
да, ты ему мап передаешь, в какую колонку чо писать
например df.na.fill(Map("a" -> 1, "b" -> 1.0, "c" -> "one"))

Alex
30.12.2017
14:08:10

Andrey
30.12.2017
14:08:21
да, конечно
.na. - это класс функций над датафреймами

Alex
30.12.2017
14:08:53

Andrey
30.12.2017
14:09:03
незачто)

Alex
30.12.2017
15:59:25
@tenKe не подскажешь, почему соответствия не находит filter? Типы одинаковые внутри.
dataVec.filter(x => x==centroids(2))
внутри datavec linalg.Vector и внутри centroids
scala> dataVec.getClass == centroids.getClass
res96: Boolean = true
Вообще я хочу из датасета найти ключ, соответствующий вектору
А вектор - центройд кластера
из KMeansModel.clusterCenters

Andrey
30.12.2017
16:07:27
какой тип у dataVec ?
RDD[Vector] ?

Google

Alex
30.12.2017
16:08:52
Оба Array
с вектором внутри

Andrey
30.12.2017
16:14:10
на примитивных примерах вроде работает:
import org.apache.spark.ml.linalg.Vector
val a = Vectors.dense(1,2,3)
val b = Vectors.dense(4,5,6)
val c = Array(a,b)
c.filter( x => x == a).length // res = 1

Alex
30.12.2017
16:15:21
У меня тоже работает на примитивных)
contains
FALSE показывает на центройды вообще. Что странно)

Andrey
30.12.2017
16:17:13
может этого вектора в твоем датасете действительно нет?
размер вектора в процессе обработки поменялся или еще что-то
попробуй dataVec.map { x => x.mkString }.filter{ x => x == centroids(2).mkString }

Alex
30.12.2017
16:20:51
mkString is not a member of org.apache.spark.mllib.linalg.Vector
Спасибо. Попробую проверить мб вектора меняются как-то.

Andrey
30.12.2017
16:21:21
О_о у меня работает