Ответ 1
Попробуйте что-то вроде этого:
df.select([c for c in df.columns if c in ['_2','_4','_5']]).show()
Я ищу способ выбора столбцов моей dataframe в pyspark. Для первой строки я знаю, что могу использовать df.first()
но не уверен в столбцах, учитывая, что у них нет имен столбцов.
У меня есть 5 столбцов и вы хотите прокрутить каждый из них.
+--+---+---+---+---+---+---+
|_1| _2| _3| _4| _5| _6| _7|
+--+---+---+---+---+---+---+
|1 |0.0|0.0|0.0|1.0|0.0|0.0|
|2 |1.0|0.0|0.0|0.0|0.0|0.0|
|3 |0.0|0.0|1.0|0.0|0.0|0.0|
Попробуйте что-то вроде этого:
df.select([c for c in df.columns if c in ['_2','_4','_5']]).show()
Первые два столбца и 5 строк
df.select(df.columns[:2]).take(5)
Используйте df.schema.names
:
spark.version
# u'2.2.0'
df = spark.createDataFrame([("foo", 1), ("bar", 2)])
df.show()
# +---+---+
# | _1| _2|
# +---+---+
# |foo| 1|
# |bar| 2|
# +---+---+
df.schema.names
# ['_1', '_2']
for i in df.schema.names:
# df_new = df.withColumn(i, [do-something])
print i
# _1
# _2
Набор данных в ss.csv
содержит несколько интересующих меня столбцов:
ss_ = spark.read.csv("ss.csv", header= True,
inferSchema = True)
ss_.columns
['Reporting Area', 'MMWR Year', 'MMWR Week', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Current week', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Current week, flag', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Previous 52 weeks Med', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Previous 52 weeks Med, flag', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Previous 52 weeks Max', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Previous 52 weeks Max, flag', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Cum 2018', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Cum 2018, flag', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Cum 2017', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Cum 2017, flag', 'Shiga toxin-producing Escherichia coli, Current week', 'Shiga toxin-producing Escherichia coli, Current week, flag', 'Shiga toxin-producing Escherichia coli, Previous 52 weeks Med', 'Shiga toxin-producing Escherichia coli, Previous 52 weeks Med, flag', 'Shiga toxin-producing Escherichia coli, Previous 52 weeks Max', 'Shiga toxin-producing Escherichia coli, Previous 52 weeks Max, flag', 'Shiga toxin-producing Escherichia coli, Cum 2018', 'Shiga toxin-producing Escherichia coli, Cum 2018, flag', 'Shiga toxin-producing Escherichia coli, Cum 2017', 'Shiga toxin-producing Escherichia coli, Cum 2017, flag', 'Shigellosis, Current week', 'Shigellosis, Current week, flag', 'Shigellosis, Previous 52 weeks Med', 'Shigellosis, Previous 52 weeks Med, flag', 'Shigellosis, Previous 52 weeks Max', 'Shigellosis, Previous 52 weeks Max, flag', 'Shigellosis, Cum 2018', 'Shigellosis, Cum 2018, flag', 'Shigellosis, Cum 2017', 'Shigellosis, Cum 2017, flag']
но мне нужно только несколько:
columns_lambda = lambda k: k.endswith(', Current week') or k == 'Reporting Area' or k == 'MMWR Year' or k == 'MMWR Week'
Фильтр возвращает список нужных столбцов, список оценивается:
sss = filter(columns_lambda, ss_.columns)
to_keep = list(sss)
список нужных столбцов распаковывается как аргументы функции выбора фрейма данных, которая возвращает набор данных, содержащий только столбцы в списке:
dfss = ss_.select(*to_keep)
dfss.columns
Результат:
['Reporting Area',
'MMWR Year',
'MMWR Week',
'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Current week',
'Shiga toxin-producing Escherichia coli, Current week',
'Shigellosis, Current week']
У df.select()
есть дополнительная пара: http://spark.apache.org/docs/2.4.1/api/python/pyspark.sql.html#pyspark.sql.DataFrame.drop
сбросить список столбцов.
Прежде всего, ваша схема создается по ошибке при импорте из MySQL или другой базы данных. вы можете использовать словарь, чтобы изменить его
cursor = conn.cursor(MySQLdb.cursors.DictCursor)
df.select( '_ 2', '_ 4', '_ 5'). шоу()
или же
df = df.select('_ 2', '_ 4', '_ 5')
Вы можете использовать массив и распаковать его внутри select:
cols = ['_2','_4','_5']
df.select(*cols).show()