Одно из возможных решений в ответе Холдена, и вот некоторые другие решения:
Использование RDD:
Вы можете использовать преобразование sampleByKeyExact из PairRDDFunctions .
sampleByKeyExact (boolean withReplacement, scala.collection.Map фракции, длинные семплы) Возвращает подмножество этого RDD, взятого с помощью ключа (через стратифицированную выборку), содержащего точно math.ceil (numItems * samplingRate) для каждой страты (группа пар с одним и тем же ключом).
blockquote>И так я буду делать:
Учитывая следующий список:
val seq = Seq( (2147481832,23355149,1),(2147481832,973010692,1),(2147481832,2134870842,1),(2147481832,541023347,1), (2147481832,1682206630,1),(2147481832,1138211459,1),(2147481832,852202566,1),(2147481832,201375938,1), (2147481832,486538879,1),(2147481832,919187908,1),(214748183,919187908,1),(214748183,91187908,1) )
Я создал пару
RDD
, отображая всех пользователей как клавиши:val data = sc.parallelize(seq).map(x => (x._1,(x._2,x._3)))
Затем я настрою
fractions
для каждой клавиши следующим образом, посколькуsampleByKeyExact
принимает карту дробей для каждой клавиши:val fractions = data.map(_._1).distinct.map(x => (x,0.8)).collectAsMap
То, что я здесь сделал, - это сопоставление ключей для поиска разных ключей, а затем сопоставление каждой части с долей равно
0.8
. Я собираю все как карту.Образец сейчас:
import org.apache.spark.rdd.PairRDDFunctions val sampleData = data.sampleByKeyExact(false, fractions, 2L)
или
val sampleData = data.sampleByKeyExact(withReplacement = false, fractions = fractions,seed = 2L)
Вы можете проверить количество на ваших ключах или данных или образец данных:
scala > data.count // [...] // res10: Long = 12 scala > sampleData.count // [...] // res11: Long = 10
Использование DataFrames:
Рассмотрим те же данные (
seq
) из предыдущего раздела.val df = seq.toDF("keyColumn","value1","value2") df.show // +----------+----------+------+ // | keyColumn| value1|value2| // +----------+----------+------+ // |2147481832| 23355149| 1| // |2147481832| 973010692| 1| // |2147481832|2134870842| 1| // |2147481832| 541023347| 1| // |2147481832|1682206630| 1| // |2147481832|1138211459| 1| // |2147481832| 852202566| 1| // |2147481832| 201375938| 1| // |2147481832| 486538879| 1| // |2147481832| 919187908| 1| // | 214748183| 919187908| 1| // | 214748183| 91187908| 1| // +----------+----------+------+
Мы вам понадобится базовый
RDD
, чтобы сделать это, на котором мы создаем кортежи элементов в этомRDD
, определяя наш ключ как первый столбец:val data: RDD[(Int, Row)] = df.rdd.keyBy(_.getInt(0)) val fractions: Map[Int, Double] = data.map(_._1) .distinct .map(x => (x, 0.8)) .collectAsMap val sampleData: RDD[Row] = data.sampleByKeyExact(withReplacement = false, fractions, 2L) .values val sampleDataDF: DataFrame = spark.createDataFrame(sampleData, df.schema) // you can use sqlContext.createDataFrame(...) instead for spark 1.6)
Теперь вы можете проверить количество ваши ключи или
df
или образец данных:scala > df.count // [...] // res9: Long = 12 scala > sampleDataDF.count // [...] // res10: Long = 10
Начиная с Spark 1.5.0 вы можете использовать метод
DataFrameStatFunctions.sampleBy
:df.stat.sampleBy("keyColumn", fractions, seed)
Вы не можете программно установить стиль просмотра, но вы можете сделать что-то вроде textView.setTextAppearance(context, android.R.style.TextAppearance_Small);
.
Попробуйте
textview.setTextAppearance(context, R.style.yourstyle);
. Это может не сработать. Попробуйте создать xml с таким textview
textviewstyle.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="@android:style/TextAppearance.DeviceDefault.Small" />
.
TextView myText = (TextView)getLayoutInflater().inflate(R.layout.tvstyle, null);
На самом деле, это возможно на уровне API 21.
TextView имеет конструктор 4 параметров :
TextView (Context context,
AttributeSet attrs,
int defStyleAttr,
int defStyleRes)
В этом случае два средних параметра не нужны. Следующий код создает TextView непосредственно в действии и определяет только его ресурс стиля:
TextView myStyledTextView = new TextView(this, null, 0, R.style.my_style);
В настоящее время невозможно установить стиль просмотра программно.
Чтобы обойти это, вы можете создать XML-файл макета шаблона с назначенным стилем, например, в res/layout
создать tvtemplate.xml
со следующим содержимым:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is a template"
style="@android:style/TextAppearance.DeviceDefault.Small" />
, а затем надуть это для создания экземпляра вашего нового TextView:
TextView myText = (TextView)getLayoutInflater().inflate(R.layout.tvtemplate, null);
Compat версия (из-за устаревания в API 23):
TextViewCompat.setTextAppearance(textView, android.R.style.TextAppearance_DeviceDefault_Small);
Для представлений, сгенерированных во время выполнения (в коде), вы можете передать стиль конструктору: View (Context, AttributeSet, int)
В другом случае вы должны вызывать методы varios для изменить внешний вид
@Deprecated
public void setTextAppearance(Context context, @StyleRes int resId)
этот метод устарел с Android SDK 23.
Вы можете использовать безопасную версию:
if (Build.VERSION.SDK_INT < 23) {
super.setTextAppearance(context, resId);
} else {
super.setTextAppearance(resId);
}