it-swarm.com.ru

Выберите конкретные столбцы из Spark DataFrame

Я новичок в Spark.

Я загрузил данные CSV в Spark DataFrame.

Мне нужно разделить этот фрейм данных на два разных фрейма данных, каждый из которых содержит набор столбцов оригинала.

Таким образом, мой вопрос заключается в том, как создать подмножество фрейма данных Spark на основе столбцов?

3
A.HADDAD

Если вы хотите разделить ваш фрейм данных на два разных, сделайте два выбора на нем с разными столбцами, которые вы хотите.

 val sourceDf = spark.read.csv(...)
 val df1 = sourceDF.select(first set of columns)
 val df2 = sourceDF.select(second set of columns)

Обратите внимание, что это, конечно, означает, что sourceDf будет оцениваться дважды, поэтому, если он может поместиться в распределенную память, и вы используете большинство столбцов на обоих фреймах данных, было бы неплохо кэшировать его. В нем есть много лишних столбцов, которые вам не нужны, затем вы можете сначала выбрать его для выбора столбцов, которые вам понадобятся, чтобы все эти дополнительные данные сохранялись в памяти.

2
puhlen

Допустим, наш родительский Dataframe имеет 'n' столбцы

мы можем создать 'x' дочерние DataFrames (давайте рассмотрим 2 в нашем случае). 

Столбцы для дочернего Dataframe могут быть выбраны по желанию из любого из родительских столбцов Dataframe. 

Предположим, что источник содержит 10 столбцов и мы хотим разделить на 2 DataFrames , которые содержат столбцы, на которые ссылается родительский Dataframe.

Столбцы для дочернего Dataframe могут быть определены с помощью select Dataframe API 

val parentDF = spark.read.format("csv").load("/path of the CSV file")

val Child1_DF = parentDF.select("col1","col2","col3","col9","col10").show()

val child2_DF = parentDF.select("col5", "col6","col7","col8","col1","col2").show()

Обратите внимание, что количество столбцов в дочерних фреймах данных может отличаться по длине и будет меньше, чем количество столбцов родительского фрейма данных.

мы также можем ссылаться на имена столбцов, не упоминая настоящие имена, используя позиционные индексы нужного столбца из родительского фрейма данных. 

Спарк импорта сначала влияет на класс, который действует как вспомогательный класс для использования $ -notation для доступа к столбцам с использованием позиционных индексов.

import spark.implicits._
import org.Apache.spark.sql.functions._

val child3_DF  = parentDF.select("_c0","_c1","_c2","_c8","_c9").show()

мы также можем выбрать столбец на основе определенных условий. Допустим, мы хотим, чтобы в дочернем фрейме данных были выбраны только четные столбцы. К четным мы относимся к четным индексированным столбцам и индексам, начинающимся с '0' 

val parentColumns = parentDF.columns.toList


res0: List[String] = List(_c0, _c1, _c2, _c3, _c4, _c5, _c6, _c7,_c8,_c9)

val evenParentColumns =  res0.zipWithIndex.filter(_._2 % 2 == 0).map( _._1).toSeq

res1: scala.collection.immutable.Seq[String] = List(_c0, _c2, _c4, _c6,_c8)

Теперь передайте эти столбцы для выбора из parentDF. Обратите внимание, что для API выбора требуются аргументы типа seq. Так что мы преобразовали evenParentColumns в коллекцию Seq.

val child4_DF = parentDF.select(res1.head, res1.tail:_*).show()

Это покажет четные индексированные столбцы из родительского Dataframe.


| _c0 | _c2 | _c4 | _c6 | _c8 |


| ITE00100554 | ТМЫ | пустой | E | 1 |

| TE00100554 | TMIN | null | E | 4 |

| GM000010962 | СВКЦ | пустой | E | 7 |

Так что теперь мы остались с четными столбцами в кадре данных 

Точно так же мы можем также применить другие операции к столбцу Dataframe, как показано ниже

val child5_DF = parentDF.select($"_c0", $"_c8" + 1).show()

Таким образом, многими упомянутыми способами мы можем выбрать столбцы в кадре данных. 

2
prasanna kumar

Решено, Просто используйте выберите метод для кадра данных, чтобы выбрать столбцы:

 val df=spark.read.csv("C:\\Users\\Ahmed\\Desktop\\cabs_trajectories\\cabs_trajectories\\green\\2014\\green_tripdata_2014-09.csv")

val df1=df.select("_c0")

это подмножество первого столбца кадра данных

0
A.HADDAD

Просто с помощью select select вы можете выбрать определенные столбцы, дать им читаемые имена и привести их. Например, вот так: 

spark.read.csv(path).select(
          '_c0.alias("stn").cast(StringType),
          '_c1.alias("wban").cast(StringType),
          '_c2.alias("lat").cast(DoubleType),
          '_c3.alias("lon").cast(DoubleType)
        )
          .where('_c2.isNotNull && '_c3.isNotNull && '_c2 =!= 0.0 && '_c3 =!= 0.0)
0
dehasi